Учебное пособие: Подклассы окон

Базовые классы окон

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

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

До сих пор мы сталкивались только с одним базовым классом - обычное перекрывающееся окно. Процедура обработки сообщений этого базового класса - DefWindowProc.

Для диалогов существует специальная функция DefDlgProc, определяющая базовый класс диалогов. При желании Вы можете создавать собственные классы диалогов, основанные на этом базовом классе так-же, как и обычные окна, применяя функцию RegisterClass. При этом Вы должны в структуре данных окна зарезервировать дополнительное пространство, размером .cbWndExtra= DLGWINDOWEXTRA (30 байт). В этом случае Вы сможете создавать окна немодального диалога с помощью функции CreateWindow, либо указав имя зарегистрированного класса в шаблоне диалога.

Функция DefDlgProc выполняет обработку нескольких дополнительных сообщений, которые не обрабатываются (или редко используются) обычным окном:

WM_INITDIALOG инициализация диалога (это сообщение не посылается оконной функции диалога, оно передается только в процедуру диалога)

WM_GETDLGCODE посылается управляющему элементу для выяснения ожидаемых управляющих сообщений

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

WM_PARENTNOTIFY извещение о создании/удалении/”щелчке” мышкой

WM_ENTERIDLE модальный диалог или меню ожидает ввода данных. посылается диалогом или меню главному окну приложения.

DM_GETDEFID узнать идентификатор DEFPUSHBUTTON

DM_SETDEFID выбрать новую DEFPUSHBUTTON

Внимание! сообщения DM_GETDEFID и DM_SETDEFID имеют номера WM_USER и WM_USER+1, поэтому не используйте собственных сообщений WM_USER и WM_USER+1 для посылки окну диалога!

Функция диалога

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

Эта функция диалога, не являясь обычной оконной процедурой, возвращает результат не в виде двойного слова, а в виде логической величины:

BOOL CALLBACK _export DlgProc( hWnd, wMsg, wPar, lPar ) {

return FALSE;

}

Функция DlgProc возвращает FALSE, если сообщение надо обрабатывать стандартным образом и TRUE, если сообщение обработано. Единственное исключение - сообщение WM_INITDIALOG, где значение TRUE указывает на необходимость установить фокус на требуемый управляющий элемент, а FALSE говорит о том, что Вы уже установили фокус.

Обычно Вы пишете только DlgProc. Однако эта функция возвращает логическую величину, используемую процедурой DefDlgProc. В некоторых случаях требуется возвращать конкретный конечный результат обработки сообщения (например сообщение WM_QUERYOPEN).

Вы можете сделать это с помощью функций GetWindowLong и SetWindowLong, указывая смещение DWL_MSGRESULT для чтения/изменения возвращаемого по умолчанию значения.

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

Эти данные размещены в пространстве, добавляемом к структуре, описывающей окно, при его создании (DLGWINDOWEXTRA). Соответственно DWL_MSGRESULT и DWL_DLGPROC имеют положительные значения.

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

· модальный диалог завершается с помощью процедуры

void EndDialog( hWnd, wPar );

К-во Просмотров: 590
Бесплатно скачать Учебное пособие: Подклассы окон