Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Оптимальный цикл обработки сообщений в WinMain

87
29 октября 2008 года
Kogrom
2.7K / / 02.02.2008
При использовании немодального диалога в книгах рекомендуют использовать примерно следующий цикл обработки сообщений:

 
Код:
while (GetMessage(&msg,NULL,0,0))
    {
        if(!IsDialogMessage(hModelessDlg, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

Но если приложение сравнительно большое, с некоторым количеством немодальных диалогов и дочерних окон другого типа, то отсеивать все диалоги становится сложно - можно что-то пропустить.

По идее, можно вытащить хэндл окна из msg.hwnd, как-то определить его тип, и если это немодальный диалог, то применить для него соответствующую функцию и т.д.

Но вот как определить, что окно является немодальным диалогом?
87
29 октября 2008 года
Kogrom
2.7K / / 02.02.2008
Посидел немного, придумал такой вариант:

 
Код:
if (GetWindowLongPtr(msg.hwnd, DWLP_DLGPROC) == 0)
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
            else
            {
                 IsDialogMessage(msg.hwnd, &msg);
            }

Вроде работает, но уверенности в безопасности такого кода пока нет...
14
29 октября 2008 года
Phodopus
3.3K / / 19.06.2008
Тебе не кажется что ты только замедлил процесс? :)
87
29 октября 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: Phodopus
Тебе не кажется что ты только замедлил процесс? :)


нет.
if (GetWindowLongPtr(msg.hwnd, DWLP_DLGPROC) == 0)
...
IsDialogMessage(msg.hwnd, &msg);

будет работать не хуже, а выглядит красивше, чем

if( !(IsDialogMessage(hModelessDlg1, &msg) || IsDialogMessage(hModelessDlg2, &msg) || ... IsDialogMessage(hModelessDlgN, &msg)) )

Но можно ли так делать, вот в чем вопрос.

14
29 октября 2008 года
Phodopus
3.3K / / 19.06.2008
а зачем делать
 
Код:
if( !(IsDialogMessage(hModelessDlg1, &msg) ||   IsDialogMessage(hModelessDlg2, &msg) ||  ... IsDialogMessage(hModelessDlgN, &msg)) )

? :eek:
87
30 октября 2008 года
Kogrom
2.7K / / 02.02.2008
Насколько я понимаю, при использовании немодальных диалогов необходимо отсиевать сообщения, адресованные им. Логику тут я не совсем понял (вроде бы в сообщении и так указывается какому окну оно предназначено), но опыт показывает, что если не делать так, то эти сообщения иногда отрабатывает и главное окно или другие дочерние окна.

То есть надо перебирать все хэндлы немодальных диалогов, пытаясь переправить текущее сообщение им. Если не получится, то отправлять главному окну.

Если же поставить тупо IsDialogMessage(msg.hwnd, &msg); то некоторые сообщения не доходят до дочерних окон, которые не являются немодальными диалогами.
14
30 октября 2008 года
Phodopus
3.3K / / 19.06.2008
Почитал MSDN, освежил память. Размышления следующие: IsDialogMessage предназначена для конвертации некоторых клавиатурных сообщений в специализированные диалоговые. Клавиатурный фокус в один момнет может находиться лишь у одного окна. Вывод - пробуй при активации каждого диалога изменять переменную hModelessDlg на активный, и оставить изначальный вариант выемки сообщений.
87
30 октября 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: Phodopus
Вывод - пробуй при активации каждого диалога изменять переменную hModelessDlg на активный, и оставить изначальный вариант выемки сообщений.


...а при деактивации устанавливать hModelessDlg в NULL, так как не обязательно следующим активным окном будет диалог.

Тоже вариант. Можно сделать статическую переменную типа hActiveModelessDlg в классе-обертке диалога, а в базовом классе диалога делать операции с этой переменной.

Правда тут придется повозиться с обработкой сообщения WM_ACTIVATE. Кроме того, есть опасения (пока необоснованные), что может произойти осечка, которая приведет к неверной работе программы до следующей активации/деактивации диалогов.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог