Операционная система Microsoft Windows 3.1 для программиста -том 2


Листинг 3.15. Файл dialognm\dialognm.cpp - часть 3


case WM_COMMAND: { switch(wParam) { // Сообщение от кнопки "OK" case IDOK:

// Отмена диалоговой панели. // Это сообщение приходит, когда пользователь // нажимает на клавишу <Esc> case IDCANCEL: { // Уничтожаем диалоговую панель DestroyWindow(hdlg);

// Завершаем работу приложения DestroyWindow(hwndMain); return TRUE; } } } } return FALSE; }

Функция WinMain приложения DIALOGNM аналогична функции WinMain приложения DIALOG. Она создает главное окно приложения, в котором располагает кнопку 'About...", вслед за чем запускает цикл обработки сообщений.

Так как наше приложение создает немодальную диалоговую панель, в цикле обработки сообщений мы вызываем функцию IsDialogMessage:

hwndDlg = (HWND)0; while(GetMessage(&msg, 0, 0, 0)) { if(hwndDlg == 0 !IsDialogMessage(hwndDlg, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } }

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

Когда немодальная диалоговая панель будет создана, идентификатор ее окна будет записан в переменную hwndDlg. После этого в работу включится функция IsDialogMessage. Она будет "вылавливать" в очереди приложения сообщения, предназначенные для диалоговой панели hwndDlg и выполнять их обработку. Все остальные сообщения будут обработаны обычным образом функциями TranslateMessage и DispatchMessage.

Функция главного окна приложения обрабатывает сообщение WM_COMMAND, поступающее от кнопки 'About...". В ответ на это сообщение создается немодальная диалоговая панель, для чего вызывается функция CreateDialog:

hwndDlg = CreateDialog(hInst,"DIALOG_OK", hwnd, lpfnDlgProc);

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

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

case WM_DESTROY: { DestroyWindow(hwndDlg); PostQuitMessage(0); return 0; }

Функция диалоговой панели обрабатывает сообщения WM_INITDIALOG и WM_COMMAND.

Обработка сообщения WM_INITDIALOG сводится к возвращению значения TRUE. Если приходит сообщение WM_COMMAND с идентификаторами IDOK или IDCANCEL, функция диалоговой панели завершает диалоговую панель, уничтожая свое окно и главное окно приложения:

case IDOK: case IDCANCEL: { DestroyWindow(hdlg); DestroyWindow(hwndMain); return TRUE; }

Файл ресурсов приложения, содержащий шаблон немодальной диалоговой панели, приведен в листинге 3.16.




Начало  Назад  Вперед



Книжный магазин