Вопрос о IsDialogMessage () в WIN32 - PullRequest
8 голосов
/ 08 декабря 2010

Я создаю простую программу win32 с одним главным окном и немодальным диалогом.

Я знаю, что с помощью IsDialogMessage () программа будет отправлять сообщения в немодальное окно (например, события клавиатуры).

// step 3: The Message Loop
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
    if(!IsDialogMessage(g_hToolbar, &Msg)) 
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
}

Но без использования IsDialogMessage () немодальное окно по-прежнему получает такие события, как щелчок и некоторые другие события, отправляемые мышью.

Почему?Как может этот немодальный получить эти сообщения, если основной цикл не отправляет на него сообщения?

Я просто хочу знать, как это работает внутри.

Ответы [ 3 ]

9 голосов
/ 09 декабря 2010

IsDialogMessage отфильтровывает некоторые из сообщений, но позволяет большинству сообщений попадать в часть TranslateMessage / DispatchMessage цикла обработки сообщений и отправляться нормально.

Причина, по которой IsDialogMessage должен обрабатывать некоторые сообщения, заключается в том, что сообщения должны были быть доставлены в неправильное окно.

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

Большинство других сообщений - наведение мыши, рисование и т. Д. - все равно будут доставлены в диалоговое окно proc - и обрабатываются в обычном режиме. На самом деле это просто подмножество сообщений, предназначенных для отправки элементам управления, но которые должны обрабатываться диалоговым окном, которое IsDialogMessage отфильтровывает и обрабатывает.

4 голосов
/ 08 декабря 2010

Модальное окно отключит родительское окно, тот факт, что ваш HWND называется g_hToolbar, говорит мне, что это не модальное диалоговое окно ...

Модальные диалоги ( DialogBox *) создают свой собственный цикл сообщений (и работают как MessageBox и т. Д.), Вы должны говорить о немодальных диалогах ( CreateDialog *). Вы получите все сообщения. из оконного менеджера без IsDialogMessage, IsDialogMessage выполняет диспетчер диалогов таких задач, как обработка TAB и фокус кнопки по умолчанию.

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

0 голосов
/ 08 декабря 2010

Без IsDialogMessage некоторые функции диалога, такие как изменение фокуса при нажатии клавиши Tab, не работают.IsDialogMessage реализует эти специфичные для диалога функции.Если он возвращает TRUE, текущее сообщение уже обработано, и нет необходимости вызывать TranslateMessage и DispatchMessage.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...