Типичный вид функции окна

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)

       {

                   switch(msg)

                   {

                                case WM_PAINT:

                                // Обновить содержимое клиентской области окна

                                {

                                           ...

                                }; break;

 

                                case WM_DESTROY:

                                // Пользователь удалил окно

                                {

                                           ...

 

                                // В функции главного окна следует в очередь

                                // сообщений послать сообщение WM_QUIT

                                            PostQuitMessage(0);

                                }; break;

                                default: return DefWindowProc(hWnd, msg, wParam, lParam);

                   }

       return 0l;

       }

Функция окна получает сообщение из двух источников: из цикла обработки сообщений и от Windows:

Из цикла обработки сообщений поступают сообщения ввода: перемещение и нажатие клавиш мыши, нажатие и отпускание клавиш клавиатуры и, если установлен генератор событий таймера, сообщения от таймера.

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

 

Отображение содержимого окна, сообщение WM_PAINT

Сообщение WM_PAINT крайне важно для программирования под Windows. Оно сообщает программе, что часть или вся рабочая область окна недействительна (invalid) и ее следует перерисовать.

Ситуации, когда рабочая область может становиться недействительной.

При первом создании окна недействительна вся рабочая зона(другое название – клиентская часть) окна, поскольку программа еще ничего не нарисовала. Сообщение WM_PAINT, посылаемое, когда приложение вызывает функцию UpdateWindow, заставляет оконную процедуру что-то нарисовать в рабочей области.

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

Когда пользователь минимизирует окно программы, а затем вновь восстанавливает до прежнего размера, то в Windows содержимое рабочей области не сохраняется (в графической среде это бы привело к тому, пришлось бы хранить слишком много данных). Вместо этого Windows делает недействительным все окно. Затем оконная процедура получает сообщение WM_PAINT и сама восcтанавливает содержимое окна.

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

Если по логике работы приложения при обработке того или другого сообщения требуется изменить содержимое окна, то приложение может само при помощи функции InvalidateRect объявить любую область окна как недействительную (т.е. требующую обновления), а затем сообщить Windows, что необходимо перерисовать часть или все окно при помощи функции UpdateWindow

       InvalidateRect(hWnd,NULL,TRUE); UpdateWindow(hWnd);

        Первый параметр функции InvalidateRect является идентификатором окна, для которого выполняется операция. Второй параметр - указатель на структуру типа RECT, определяющую прямоугольную область, подлежащую обновлению (если он равен NULL, то недействительной объявляется вся внутренняя часть окна). Третий параметр определяет необходимость стирания фона окна (если параметр задан как TRUE, фон окна подлежит стиранию).

Итак, сообщение WM_PAINT посылается операционной системой окну, когда его часть требует перерисовки, и в очереди сообщений потока, владеющего этим окном, не находится других необработанных сообщений.

Eсли окно содержит одну или несколько областей, подлежащих обновлению, то приложение получает одно сообщение WM_PAINT, в котором определена область, охватывающая все указанные области.

Обработка сообщения WM_PAINT почти всегда начинается с вызова функции BeginPaint

       case WM_PAINT: // Обновить содержимое клиентской области окна

       {

                   PAINTSTRUCT ps;

                   HDC hDC=BeginPaint(hWnd,&ps);

                  ... // вызов функций GDI для контекста HDC


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: