if(DlgWin)PostMessage(DlgWi n.WM_RBUTT0ND0WN.MK_RBUTTON.0x50005):
Причина подобного поведения заключается в том, что функция EndDialogO уничтожает модальный диалог. Окно немодального диалога она только закрывает, но не уничтожает. Его легко заново показать, вызвав функцию ShowWi ndow(DlgWi n. SWJORMAL).
Если использовать одну оконную процедуру и для модального, и для немодального диалога, то при закрытии окна необходимо учитывать его тип, используя, например, следующую конструкцию:
if (hDlg-DlgWin) DestroyWindow(hDlg): else EndDialog(hDlg. TRUE):
Теперь нужно снова запустить проект и вызвать на экран сначала немодальный, а затем модальный диалог (рис. 7.3). Легко убедиться в том, что модальный диалог блокирует перевод фокуса ввода на основное окно, но при помощи щелчка мыши можно перенести фокус ввода на немодальный диалог и обратно. В немодальный диалог, в отличие от основного окна, продолжают поступать сообщения Немодальный диалог от кнопок мыши. Но щелчок по нему правой кнопкой сразу выводит сообщение Немодальный без предварительного извещения из основного цикла Щелчок в окне диалога.
Рис. 7.3. Сообщение немодального диалога Это указывает на то, что в данной ситуации немодальный диалог получает сообщения не через основной цикл опроса очереди приложения, а из цикла опроса очереди модального диалога. Но в модальном диалоге никто не предусмотрел функцию IsDialogMessageO, поэтому при одновременном выводе двух диалогов в немодальном окне перестают правильно работать клавиши Enter и Tab. Справочная система не дает рекомендаций по корректному выходу из данной ситуации.
Тот факт, что модальный диалог имеет свой цикл опроса очереди, позволяет достаточно просто организовать оконное приложение. Нужно создать диалоговое окно при помощи редактора ресурсов. При этом в текущем примере можно указать имя ресурса «START» и разместить в нем единственную кнопку завершения работы IDCANCEL При этом нужно не забыть взвести в свойствах диалога на вкладке More Style флажок Visible и выбрать любой стиль окна, кроме Child.