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

· немодальный диалог заканчивается при уничтожении окна диалога с помощью обычной функции DestroyWindow. При этом Вы должны принять меры, что бы в главном цикле обработки сообщений больше не вызывалась процедура IsDialogMessage для этого диалога.

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

При этом обработка сообщений диалога может быть изображена следующей схемой:

Если мы указали адрес функции диалога NULL, то DlgProc, изображенная на этой схеме, вызываться не будет. Рассмотрим небольшой пример:

FARPROC lpfnOwnProc;

// новая оконная процедура

LONG CALLBACK _export OwnDlgProc(

HWND hWnd, UINT wMsg, UINT wPar, LONG lPar

) {

switch ( wMsg ) // нестандартная обработка сообщений

case WM_CTLCOLOR:

return ...;

default:

break;

}

return DefDlgProc( hWnd, wMsg, wPar, lPar );

}

// в какой–либо иной процедуре:

// создание немодального диалога

HWND hModeless;

lpfnOwnProc= MakeProcInstance( (FARPROC)OwnDlgProc, hInstance );

hModeless= CreateDialog( hInstance, “my_res”, hWndOwner, NULL );

SetWindowLong( hModeless, GWL_WNDPROC, (LONG)lpfnOwnProc );

// Внимание! Так как подстановка процедуры осуществляется после

// создания окна, то первые сообщения, включая WM_INITDIALOG

// уже обработаны стандартной функцией

...

// после закрытия окна диалога

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