Оптимальный цикл обработки сообщений в WinMain
{
if(!IsDialogMessage(hModelessDlg, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Но если приложение сравнительно большое, с некоторым количеством немодальных диалогов и дочерних окон другого типа, то отсеивать все диалоги становится сложно - можно что-то пропустить.
По идее, можно вытащить хэндл окна из msg.hwnd, как-то определить его тип, и если это немодальный диалог, то применить для него соответствующую функцию и т.д.
Но вот как определить, что окно является немодальным диалогом?
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
IsDialogMessage(msg.hwnd, &msg);
}
Вроде работает, но уверенности в безопасности такого кода пока нет...
нет.
if (GetWindowLongPtr(msg.hwnd, DWLP_DLGPROC) == 0)
...
IsDialogMessage(msg.hwnd, &msg);
будет работать не хуже, а выглядит красивше, чем
if( !(IsDialogMessage(hModelessDlg1, &msg) || IsDialogMessage(hModelessDlg2, &msg) || ... IsDialogMessage(hModelessDlgN, &msg)) )
Но можно ли так делать, вот в чем вопрос.
? :eek:
То есть надо перебирать все хэндлы немодальных диалогов, пытаясь переправить текущее сообщение им. Если не получится, то отправлять главному окну.
Если же поставить тупо IsDialogMessage(msg.hwnd, &msg); то некоторые сообщения не доходят до дочерних окон, которые не являются немодальными диалогами.
...а при деактивации устанавливать hModelessDlg в NULL, так как не обязательно следующим активным окном будет диалог.
Тоже вариант. Можно сделать статическую переменную типа hActiveModelessDlg в классе-обертке диалога, а в базовом классе диалога делать операции с этой переменной.
Правда тут придется повозиться с обработкой сообщения WM_ACTIVATE. Кроме того, есть опасения (пока необоснованные), что может произойти осечка, которая приведет к неверной работе программы до следующей активации/деактивации диалогов.