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

Структура оконной функции Оконная функция вызывается, как только в структуру Msg попадает очередное сообщение, извлеченное из входной очереди. Задача оконной функции — определить природу сообщения и обработать его соответствующим образом.

Слайд 1Оконная функция


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

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

Слайд 3обработка сообщений
В настоящем варианте программы анализ аргумента 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(), является сообщение об уничтожении окна WM_DESTROY. Поэтому в простейшем случае, когда мы вообще не предполагаем работать с сообщениями, оконная функция все же должна включать обработку сообщения WM_DESTROY:
swich (msg) {
case WM_DESTROY:
PostQuitMessage(0) ;
return 0;
default:
return(DefWindowProc(hwnd,msg,wParam,IParam)
};

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

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


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

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

иные ресурсы Windows:
создать кисти,
перья или шрифты,
установить таймеры,
динамически выделить память и т. д.
Перед завершением приложения эти ресурсы следует освободить, иначе можно вывести из строя всю систему.

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

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

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

Слайд 9




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

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

Windows

Windows

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

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






Слайд 10Подведем итоги

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

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


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



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

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



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


Слайд 11Многооконные приложения
Если в главном окне приложения предполагается создать внутренние, порожденные окна,

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






Обратная связь

Если не удалось найти и скачать презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое ThePresentation.ru?

Это сайт презентаций, докладов, проектов, шаблонов в формате PowerPoint. Мы помогаем школьникам, студентам, учителям, преподавателям хранить и обмениваться учебными материалами с другими пользователями.


Для правообладателей

Яндекс.Метрика