Оконная функция
Структура оконной функции
обработка сообщений
Пример:
Функция DefWindowProc()
Процедура завершения приложения
Обработка сообщения WM_DESTROY
Обработка сообщения WM_DESTROY
Процедура завершения приложения
Подведем итоги
Многооконные приложения

Оконная функция. (Лекция 3)

1. Оконная функция

1

2. Структура оконной функции


Оконная функция вызывается, как только в структуру Msg попадает очередное
сообщение, извлеченное из входной очереди.
Задача оконной функции — определить природу сообщения и обработать его
соответствующим образом.
Оконная функция:
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM
wParam,LPARAM IParam)
она получает при активизации ее (функцией DispatchMessage()) 4 параметра.
• hwnd - дескриптор окна, которому предназначено данное сообщение. Это тот
самый дескриптор, который был получен нами как результат работы функции
CreateWindow(). Теперь этот же дескриптор вернулся к нам из Windows как
параметр оконной функции. Он особенно полезен в тех случаях, когда на базе
одного класса создается несколько различающихся чем-то окон. Если класс один,
то и оконная функция для всех этих окон одна; анализируя тогда параметр hwnd,
программа может определить, в какое именно окно пришло сообщение. У нас
окно одно, однако, аргумент hwnd все же понадобится.
• msg - определяет код пришедшего сообщения. Поскольку сообщений много,
оконная функция должна прежде всего проанализировать этот код и осуществить
2
переход на фрагмент обработки соответствующего сообщения.

3. обработка сообщений


В настоящем варианте программы анализ аргумента msg осуществляется с
помощью конструкции switch...case. Оконная функция должна обрабатывать все
поступающие в нее сообщения:
switch(msg) (
case WM_CREATE:

case WM_DESTROY:

//Обработка сообщения WM_CREATE
//Обработка сообщения WM_DESTROY
case WM_KEYDOWN:

//Обработка сообщения WM_KEYDOW
case WM_MOUSEMOVE:

//Обработка сообщения WM_MOUSEMOVE
case WM_TIMER:

//Обработка сообщения WM TIMER
//и т. д. для всех возможных сообщений
Однако реально в любой программе, по существу, требуется обрабатывать далеко
не все сообщения.
3

4. Пример:


если программа управляется только мышью, в ней нет необходимости
обрабатывать сообщения от клавиатуры;
совсем не обязательно программа имеет дело с таймером и т. п.
Надо еще иметь в виду, что приложение получает большое количество
сообщений системного характера,
– о перерисовке отдельных элементов окна,
– определении его размеров,
– изменении положения окна и т. д.
Все эти сообщения мы, возможно, даже не умеем обрабатывать должным
образом.
Для того чтобы дать возможность программисту работать только с теми
сообщениями, которые ему нужны, в Windows предусмотрена
специальная функция DefWindowProc() (от Default Window Procedure,
процедура Windows по умолчанию)
4

5. Функция DefWindowProc()


умеет правильно обрабатывать практически все сообщения Windows.
Единственным сообщением, не входящим "в юрисдикцию" DefWindowProc(),
является сообщение об уничтожении окна WM_DESTROY. Поэтому в
простейшем случае, когда мы вообще не предполагаем работать с сообщениями,
оконная функция все же должна включать обработку сообщения
WM_DESTROY:
swich (msg)
{
case WM_DESTROY:
PostQuitMessage(0) ;
return 0;
default:
return(DefWindowProc(hwnd,msg,wParam,IParam)
};
Такая оконная функция обеспечит обработку по умолчанию всех поступающих в
главное окно сообщений. Остается выяснить вопрос, как возникает сообщение
WM_DESTROY и в чем должна заключаться его обработка.
5

6. Процедура завершения приложения


Обычно приложения Windows завершают свою работу по команде
пользователя.
– Он может щелкнуть по кнопке завершения в правом верхнем углу окна,
– дважды щелкнуть по маленькой пиктограмме в левом верхнем углу окна,
вызвать системное меню одиночным щелчком по этой пиктограмме и выбрать
пункт "Закрыть»
– нажать клавиши Alt+F4.
Во всех этих случаях Windows убирает с экрана окно приложения и
посылает в приложение сообщение WM_DESTROY (не в очередь
приложения, а с непосредственным вызовом оконной функции).
В чем должна состоять обработка этого сообщения?
6

7. Обработка сообщения WM_DESTROY


В процессе своего выполнения программа могла использовать те или
иные ресурсы Windows:
– создать кисти,
– перья или шрифты,
– установить таймеры,
– динамически выделить память и т. д.
Перед завершением приложения эти ресурсы следует освободить, иначе
можно вывести из строя всю систему.
Возможно также, что программа использовала какие-то средства (не
связанные с Windows), которые перед завершением работы следует
привести в порядок:
– закрыть открытые файлы,
– выключить включенную аппаратуру и т. д.
7
Можно вывести на экран предупреждающее сообщение.

8. Обработка сообщения WM_DESTROY


Выполнив все завершающие действия, программа должна вызвать
функцию Windows PostQuitMessage().
– Эта функция генерирует сообщение Windows WM_QUIT,
поступающее в очередь сообщений приложения.
Функция GetMessage(), обнаружив в очереди приложения сообщение
WM_QUIT, тут же завершается с возвратом значения FALSE. Это
приводит к разрыву цикла while обработки сообщений, выполнения
последнего оператора return функции WinMain и завершению программы.
8

9. Процедура завершения приложения

Пользователь
Приложение
Приложение
“Уборка помещения”
вызов функции
PostQuitMessage()
Alt + F4
Windows
Посылка в приложение
сообщения
WM_DESTROY
Возврат из GetMessage() с
кодом FALSE, разрыв цикла
обработки сообщений
Windows
Посылка в приложение
сообщения WM_QUIT
9

10. Подведем итоги

Главная функций WinMain()
I. Регистрация класса окна
2. Создание и показ окна
Каждое поступившее в
окно сообщение вызывает
к жизни оконную
функцию.
Оконная функция главного окна состоит
из стольких фрагментов,
сколько предполагается
обрабатывать сообщений.
Конкретное содержимое каждого фрагмента
определяет программист.
3. Цикл обработки сообщений
Оконная функция
•Если WM_KEYDOW, то…….
•Если WM_MOUSEMOVE, то …..
•Если WM_DESTROY, то ..PostQuitMessage()
•Если любое ненужное сообщение, то …..
DefWindowProc()
Все сообщения, не нуждающиеся
в прикладной обработке,
поступают в функцию обработки сообщений
по умолчанию DefWindowProcQ и
обрабатываются системой Windows.
10

11. Многооконные приложения

• Если в главном окне приложения предполагается
создать
внутренние,
порожденные
окна,
то
подготовительные действия усложняются
– необходимо зарегистрировать в Windows классы
всех этих окон,
– создать окна
– показать их на экране
• В этом случае для каждого класса окон
предусматривается своя оконная функция.
11
English     Русский Правила