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

Содержание

Слайд 2

Структура оконной функции Оконная функция вызывается, как только в структуру Msg

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

Оконная функция вызывается, как только в структуру Msg попадает

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

обработка сообщений В настоящем варианте программы анализ аргумента msg осуществляется с

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

В настоящем варианте программы анализ аргумента msg осуществляется с помощью

конструкции switch...case. Оконная функция должна обрабатывать все поступающие в нее сообщения:
switch(msg) (
case WM_CREATE:
… //Обработка сообщения WM_CREATE
case WM_DESTROY:
… //Обработка сообщения WM_DESTROY
case WM_KEYDOWN:
… //Обработка сообщения WM_KEYDOW
case WM_MOUSEMOVE:
… //Обработка сообщения WM_MOUSEMOVE
case WM_TIMER:
… //Обработка сообщения WM TIMER
//и т. д. для всех возможных сообщений
Однако реально в любой программе, по существу, требуется обрабатывать далеко не все сообщения.
Слайд 4

Пример: если программа управляется только мышью, в ней нет необходимости обрабатывать

Пример:

если программа управляется только мышью, в ней нет необходимости обрабатывать

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

Функция DefWindowProc() умеет правильно обрабатывать практически все сообщения Windows. Единственным сообщением,

Функция 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 и в чем должна заключаться его обработка.
Слайд 6

Процедура завершения приложения Обычно приложения Windows завершают свою работу по команде

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

Обычно приложения Windows завершают свою работу по команде пользователя.


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

Обработка сообщения WM_DESTROY В процессе своего выполнения программа могла использовать те

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

В процессе своего выполнения программа могла использовать те или

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

Обработка сообщения WM_DESTROY Выполнив все завершающие действия, программа должна вызвать функцию

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

Выполнив все завершающие действия, программа должна вызвать функцию Windows

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

Процедура завершения приложения Пользователь Приложение Приложение Alt + F4 “Уборка помещения”

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

Пользователь

Приложение

Приложение

Alt + F4

“Уборка помещения” вызов функции PostQuitMessage()

Возврат из GetMessage()

с кодом FALSE, разрыв цикла обработки сообщений

Windows

Windows

Посылка в приложение сообщения WM_DESTROY

Посылка в приложение сообщения WM_QUIT

Слайд 10

Подведем итоги Главная функций WinMain() I. Регистрация класса окна 2. Создание

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

Главная функций WinMain()
I. Регистрация класса окна
2. Создание и показ

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

Оконная функция
Если WM_KEYDOW, то…….
Если WM_MOUSEMOVE, то …..
Если WM_DESTROY, то ..PostQuitMessage()
Если любое ненужное сообщение, то ….. DefWindowProc()

Каждое поступившее в окно сообщение вызывает к жизни оконную функцию.

Оконная функция главного окна состоит из стольких фрагментов, сколько предполагается обрабатывать сообщений. Конкретное содержимое каждого фрагмента определяет программист.

Все сообщения, не нуждающиеся в прикладной обработке, поступают в функцию обработки сообщений по умолчанию DefWindowProcQ и обрабатываются системой Windows.