Учебное пособие: Окна приложений в среде Windows

проверка новых размеров окна

WM_NCCALCSIZE flag &NCCALCSIZE_PARAMS

определение размера внутренней области

WM_NCPAINT 0 0

отображение внешней области окна

WM_ERASEBKGND hDC 0

очистка фона окна

WM_WINDOWPOSCHANGED 0 &WINDOWPOS

состояние окна изменено. Параметр lParam является указателем на структуру WINDOWPOS, содержащую данные о положении и размерах окна. Сообщения WM_WINDOWPOSCHANGING ... WM_WINDOWPOSCHANGED часто не содержат между собой никаких иных сообщений, если состояние, размер и положение не изменились. (Часто это бывает, если окно активируется в ответ на “щелчок мышкой”).

WM_MOVE 0 y & x

WM_SIZE type height & width

Эти сообщения информируют о новом положении и размерах окна. Они посылаются при соответствующих изменениях процедурой DefWindowProc() при обработке сообщения WM_WINDOWPOSCHANGED. Хотя в документации указано, что можно несколько ускорить работу, перехватывая вместо WM_MOVE и WM_SIZE сообщение WM_WINDOWPOSCHANGED и не вызывая при этом DefWindowProc(), но использовать этот прием нужно очень осторожно - так как сообщения WM_SIZE и WM_MOVE используются MDI окнами.

Рассмотренная нами цепочка сообщений порождается функцией SetWindowPos (или эквивалентной) и эти сообщения непосредственно передаются окну, а не посылаются.

WM_PAINT 0 0

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

Обновление окна

После вызова ShowWindow() в WinMain() обычно следует процедура UpdateWindow(). Эта процедура проверяет наличие неверных прямоугольников и, если они есть, передает сообщение WM_PAINT (не ставит в очередь, а вызывает обработку этого сообщения).

Обработка UpdateWindow():

WM_PAINT 0 0

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

WM_ERASEBKGND hDC 0

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


Уничтожение окна

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

<сообщения деактивации (если надо)>

Иногда бывает так, что сообщения деактивации окна не поступают, происходит деактивация приложения и уничтожение окна;

WM_DESTROY 0 0

Уничтожение внутренней области окна.

WM_NCDESTROY 0 0

Уничтожение внешней области окна.

К-во Просмотров: 332
Бесплатно скачать Учебное пособие: Окна приложений в среде Windows