{
switch(message) {
case WMJNITDIALOG: //По этому сообщению изменяется заголовок диалогового окна. Типы диалога //различаются по значению 17 параметра lParam
if(1Param-17) //При появлении окна вывести текст в поле заголовка. {
SetWindowText(hDlg,"Модальный диалог"); продолжение &
Диалоговые окна
Листинг 7.4 {продолжение)
DlgMod - hDlg; }
else SetWindowText(hDlg."Немодальный диалог"); ButtonWnd - GetDlgltem(hDlg.IDOK); return TRUE;
//При щелчке мышью в рабочей области диалогового окна выполняется обработка //сообщения WM_LBUTT0ND0WN: case WM_LBUTT0ND0WN: if (hDlg-DlgWin)
MessageBox(hDlg. "Немодальный"."Диалог".NULL); else
MessageBox(hDlg. "Модальный"."Диалог".NULL); return TRUE; case WM_CL0SE:{
EndDialog(hDlg. TRUE):
//i f(hDlg-DlgWi n)D1gWi n-0:
return TRUE;
}
case WM_COMMAND: //Обработка сообщений от управляющих элементов, if (LOWORD(wParam)-IDOK )
{EndDialog(hDlg. TRUE):
//if(hDlg-DlgWin)DlgWin-0;
return TRUE;
}
if (L0W0RD(wParam)«-ID2 ) {return TRUE: break:} return FALSE;
}
Следует еще раз отметить, что отдельные очереди создаются не к разным окнам, а к разным потокам. Используя функцию GetWindowThreadProcessId() легко убедиться, что окна подменю, диалоговое и основное окно связаны с одним потоком. То есть модальный диалог не переключает сообщения на свою очередь, а подавляет поступление щелчков мыши в основное окно.
Также следует обратить внимание на закомментированный оператор i f (hDl g -= DlgWin) DlgWin - NULL. Увеличение размера системных программ привело к резкому обострению ситуации с надежностью программного обеспечения. В настоящее время значительная часть усилий, направленных на повышение надежности, перенесена с тестирования и выявления ошибок на написание более надежного программного кода. В кодах коммерческих продуктов можно увидеть тексты, в которых объявляется нулевая локальная переменная, а строкой ниже она же проверяется условным оператором на равенство нулю. А уж занесение нуля в некоторую переменную перед завершением приложения является типичной ситуацией. При включении в текст модуля этого оператора я собирался написать, что диалоговая процедура снята с выполнения и уже нет смысла что-то записывать в Dl gWi п, так как при следующем вызове диалога функция CreateDialog заново занесет в DlgWin дескриптор созданного окна. Но если удалить комментарий, то можно увидеть, что реакция программы на щелчок правой кнопкой по окну немодального диалога изменяется. Оказывается, запись нуля перед закрытием диалога помогла выяснить, что диалог вовсе не был уничтожен.