Программирование устройств в Windows: Методические указания к выполнению практических и лабораторных работ по курсу “Операционные системы, среды и оболочки”, страница 6

Рассмотрим пример.

В EasyTextимя функции отклика на WM_DESTROY выглядит следующим образом:

EasyText_OnDestroy

Определение макроса HANDLE_WM_DESTROY, вероятно, важнейшая часть этого фрагмента WINDOWSX. Здесь просеиваются передаваемые в WndProc параметры, и выбирается hwnd как самый важный в этом случае:

((fn)(hwnd), OL)

Цель этого макроса — обнулять важнейший параметр, передаваемый в WndProc. В данном случае ни IParam, ни wParam не содержат никакой полезной информации.

Рассмотрим обработку  сообщения WM_CREATE.

HANDLE_WM_CREATE явно преобразует IParam в указатель на CREATESTRUCT, а затем удостоверяет, что этот параметр, введенный правильно, передается в функцию EasyText_OnCreate:

BOOL EasyText_OnCreate (HWND hwnd, CREATESTRUCT FAR* IpCreateStruct)

В случае сообщения WM_CREATE  пришлось бы при каждом использовании функции-обработчика сообщения писать в процедуре WndProc следующий фрагмент программы:

switch(Message)

 (

case WM_CREATE:

return HANDLE WM CREATE(hwnd, wParam, Cla OnCreate);

HANDLE_MSG освобождает  от этой необходимости, позволяя написать следующее:

switch(Message) (

HANDLE_MSG(hwnd, HM_CREATE, Cls_OnCreate) ;

и т.д... }

3.5  Отображение текста

Каждое сообщение, посылаемое в оконную процедуру, является важным. Но сообщение WM_PAINT представляется одним из наиболее  важным сообщением для всех Windows приложений. Сообщение WM_PAINT посылается в окно всякий раз, когда требуется изменить содержание рабочей области (client area). Когда программисты говорят о рабочей области окна, они обычно имеют ввиду область внутри рамки и полосу заголовка. Рабочая область — это пространство, которое программист обычно заполняет самостоятельно, в то время как Windows заботится об остальной части приложения.

Если не контролировать какую-то часть рабочей области, Windows закрашивает ее определенным цветом. Например, так будет, если  не препятствовать получению требуемых сообщений из  оконной процедуры определенной по умолчанию. В частности, неприятность возникает, если  не передать в DefWndProc сообщение, которое требует дополнительной обработки системой.

Итак, сообщения WM_PAINT посылаются в окно всякий раз, когда его необходимо перерисовать. Если окно было скрыто под другим окном и внезапно открывается, то оно получает сообщение WM__PAINT, потому что необходимо перерисовать область, скрытую под другим окном. Если окно было минимизировано или максимизировано, то оно получает сообщение WM_PAINT при восстановлении до нормального размера. Если пользователь возвращается в Windows из полноэкранного окна DOS, то все видимые окна на рабочем столе получают сообщение WM PAINT. Словом, сообщения WM PAINT жизненно важны для окон.

Теперь надо просмотреть обработчик сообщения WM_PAINT для EasyText.

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

Контексты устройств представляют собой соединительное звено между программой и некоторыми внешними устройствами вывода, которые могут быть подключены к компьютеру. В частности, контексты устройств формируют интерфейс между приложением и принтером или видеокартой. Они представляют собой существенную часть любой надежной среды программирования. Пока не было Windows, все программисты DOS сознательно или подсознательно чувствовали их недостаток. Важность контекстов устройств обусловлена существованием множества различных типов видеокарт и принтеров. Например, есть EGA, VGA, CGA, Hercules, и кто знает, сколько еще разных SVGA-карт ждут программистов. Число и разнообразие типов принтеров еще больше.

В прошлом каждое отдельное приложение нуждалось в своих собственных драйверах устройств. Windows позволяет производителям устройств вывода выпускать драйверы, совместимые с любой Windows-программой. Это оказывается возможным благодаря разработке контекстов устройств, которые формируют соединительное звено между  приложением и драйвером устройства. В Windows вполне допустимо написать один код, который будет одинаково хорошо выполняться с CGA-, VGA- или EGA-монитором.