|
WM_CREATE
Самое первое сообщение, которое получает оконная процедура - это WM_CREATE. Из названия этого сообщения видно, что оно посылается в момент создания окна (функцией CreateWindow). Наша первая оконная процедура никак не обрабатывает это сообщение, но обычно в более сложных программах при поступлении сообщения WM_CREATE происходит инициализация всевозможных переменных, данные которых должны сохраняться на протяжении всей жизни окна, выделение памяти и т.д.
WM_DESTROY
В противоположность WM_CREATE есть сообщение, которое поступает перед ликвидацией окна - это WM_DESTROY.
Сообщение WM_DESTROY посылается тогда, когда пользователь закрывает окно любым способом (кнопкой закрытия окна, с помощью пункта системного меню "Закрыть", с помощью нажатия [ALT]+[F4]).
При получении этого сообщения оконная процедура обычно освобождает память и "подготавливается" к уничтожению окна. В нашем случае, поскольку программа создает единственное окно, при его закрытии должна завершаться вся программа. Это делается с помощью вызова функции PostQuitMessage(0). Эта функция ставит в очередь программы сообщение WM_QUIT. Если Вы помните, функция GetMessage (в цикле обработки сообщений) при получении сообщения WM_QUIT возвращает 0, что заставляет прекратиться цикл. Таким образом завершается выполнение программы.
WM_PAINT
Это сообщение указывает оконной процедуре, что часть рабочей области окна (или все окно) требует перерисовки. Что это значит?
Сразу после создания окна вся его рабочая область требует перерисовки (часто еще говорят - становится недействительной (invalid)), поскольку программа еще ничего в этом окне не нарисовала. В нашей программе первое сообщение WM_PAINT появляется в результате выполнения функции UpdateWindow.
Когда пользователь изменяет размер окна, его рабочая область также становится недействительной. (Если Вы помните, при регистрации класса окна нашей программы использовались стили CS_HREDRAW и CS_VREDRAW - именно они заставляют Windows генерировать сообщение WM_PAINT при изменении размеров окна).
Когда окно минимизируется, а затем снова восстанавливается, то в Windows содержимое рабочей области не сохраняется, т.к. пришлось бы хранить слишком много данных. Вместо этого Windows делает недействительным все окно и оконная процедура получает сообщение WM_PAINT.
Если окна перекрываются, то та часть окна, которая скрыта под другими окнами также не сохраняется Windows. Позже, когда эта часть окна откроется, Windows пометит его как недействительное. Оконная процедура получит сообщение WM_PAINT для восстановления содержимого окна.
Обработка WM_PAINT чаще всего начинается с вызова функции BeginPaint:
hdc=BeginPaint(hwnd, &ps);
и заканчивается вызовом EndPaint:
EndPaint(hwnd, &ps);
Здесь hwnd - описатель окна, в котором будет выполняться рисование, ps - структура PAINSTRUCT, в которой содержится информация, которую оконная процедура может использовать для рисования. (В дальнейшем мы еще вернемся к этой структуре).
При вызове BeginPaint осуществляется обновление фона рабочей области (вспомните о поле hbrBackground в структуре WNDCLASSEX) и переменной hdc присваивается значение описателя так называемого контекста устройства. Контекст устройства описывает физическое устройство вывода информации. Это может быть не только дисплей, но и другие устройства - принтер, например. Используя контекст устройства Вы сможете рисовать только в рабочей области окна. Это очень удобно.
После окончания рисования нужно обязательно освободить контекст устройства. Это выполняется с помощью вызова функции EndPaint.
Кратко рассмотрим, как выполняется вывод текста в нашей программе.
Вызовом GetClientRect заполняется структура RECT (переменная r). Эта структура имеет поля left, top, right, bottom. Поля left и top всегда устанавливаются в 0, а right и bottom содержат соответственно ширину и высоту рабочей области окна.
Функция DrawText осуществляет вывод текста:
DrawText(hdc,"Hello, Windows!!!",-1,&r,
DT_SINGLELINE|DT_CENTER|DT_VCENTER);
Параметр hdc - описатель контекста устройства, следующий параметр - выводимая строка. Третий параметр установлен в -1, чтобы показать, что выводимая строка завершается нулем. Параметр r указывает координаты рисования, а флаги (DT_SINGLELINE|DT_CENTER|DT_VCENTER) - что текст нужно выводить в одну строку и центрировать по ширине и высоте.
|