Что такое код isdialogmessage

CWnd::IsDialogMessage

Specifies whether the member function has processed the given message. It is nonzero if the message has been processed; otherwise 0. If the return is 0, call the CWnd::PreTranslateMessage member function of the base class to process the message. In an override of the CWnd::PreTranslateMessage member function the code looks like this :

Points to an MSG structure that contains the message to be checked.

Call this member function to determine whether the given message is intended for a modeless dialog box; if it is, this function processes the message. When the IsDialogMessage function processes a message, it checks for keyboard messages and converts them to selection commands for the corresponding dialog box. For example, the TAB key selects the next control or group of controls, and the DOWN ARROW key selects the next control in a group.

You must not pass a message processed by IsDialogMessage to the or Windows functions, because it has already been processed.

Вопрос о IsDialogMessage () в WIN32

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

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

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

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

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

3 ответов

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

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

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

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

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

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

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

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

Процедура обработки дочернего окна (ListView и Edit)

В общем оно рисует новое окно не поверх формы ListView, а как то подругому.

Ладно, это отход от того что меня сейчас намного больше интересует.
Теперь ближе к сути:
Я создал в меню несколько полей и привязал Диалоги к ним. В одном из диалогов опять же есть форма ListView и так же создаётся EditBox на ней, и естественно опять же пишу новый обработчик к полю ввода. По какой то причине возникает следующяя ситуация: При двойном клике — создаётся(от координат мыши) EditBox, рисуется правильно. Далее я ввожу данные в появившееся поле ввода и нажимаю Enter, т.к. по задумке — после нажатия этой клавиши происходит сохранение результата, но однако нажатие Enter мне выводит сообщение о том, что окно не найдено или потеряно(если раскомментить строку if hEdit.. != NULL, то окажется что окна не существует, т.е. это он его не видит, но на самом деле оно есть!
Я не знаю чего я курил, но почему в основном окне обработчик работает, а в тут нет? — ведь я просто копировал обработчик, и изменения которые вносил — не могли повлиять на выход такой странной ошибки.
Возможно разгадка кроется в каких то полях, которые нужно переименовать (имеется ввиду hDlg или uMsg).
Вот часть кода обработки и создания окна:

Добавлено через 1 час 56 минут
Ещё поковырялся, и немного продвинулся, хотя непонятно куда =)
Поменял немного код в обработчике, при этом происходят следующие события:
1. Т.к. определено

то в итоге выводится сообщение о пустой строке. т.е. hEditLiOpAdd != NULL (что уже прогресс), но каким то образом переменная «char cpadd[25]» опустошается, т.е. при вызове функции GetDlgItemText — поступает пустая строка (очень странно, ведь я ввожу туда данные и они отображаются, но в переменную не заносятся).

Ну же я чувствую разгадка уже близко, помогите ^ ^

Что такое код isdialogmessage

Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] . текст программы. [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Илон Маск рекомендует:  Что такое код getwindowdc

Почему IsDialogMessage() никогда не возвращается?

Я отлаживаю приложение, которое в своем кольце сообщений вызывает IsDialogMessage(). Иногда IsDialogMessage() никогда не возвращается (где никогда не бывает интервала более 1 часа). Основываясь на символах для user32.dll, доступных на сервере символов Microsoft, он, похоже, застрял в GetNextDlgGroupItem() (или внутреннем варианте того же самого), итерации по некоторому набору окон.Почему IsDialogMessage() никогда не возвращается?

Приложение многопоточное и часто получает уведомление о внешних событиях, которые поступают в виде вызовов DCOM. Я подозреваю, что такой вызов обрабатывается неправильно таким образом, что развращает какое-то состояние окна. Если я смогу узнать, какая коррупция в государстве может вызвать бесконечный цикл в IsDialogMessage(), я думаю, что я буду легче идентифицировать источник коррупции.

ответ

Возможно, вы отключили элементы управления (используя ::EnableWindow() ), не проверив сначала, имеет ли этот контроль фокус? Если да, то фокус теряется, и GetNextDlgGroupItem() запутывается.

Это возможно; в игре есть много элементов управления, а некоторые могут быть отключены. –

Еще одна причина, по которой это может произойти, — это если вы отменили немодальный диалог. По крайней мере, это может произойти с wxWidgets .

Я знаю, что это старый, но отвечающий за потомство, поскольку никто здесь не упоминал об этом.

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

Например, если у вас есть главное окно кадра, который имеет дочернее окно с WS_EX_CONTROLPARENT, который имеет дочернее окно без WS_EX_CONTROLPARENT, который имеет дочернее окно, которое имеет фокус, и вы нажмете клавишу TAB, вы, скорее всего, встретите бесконечный цикл в том же месте, о котором вы упоминаете.

Установка расширенного стиля второго ребенка с включением WS_EX_CONTROLPARENT позволит решить проблему.

Я провел некоторое расследование, пытаясь ответить на этот вопрос. Но только в ситуации, когда родительское окно находится в собственном проекте MFC, а child — управляемые C# Windows Forms. Если у вас есть такая ситуация, вы можете попробовать 3 разрешения:

  1. Запустить цикл сообщений диалогового окна MFC на стороне Windows Forms. Вот еще информация: Integrate Windows Forms Into Your MFC Applications Through C++ Interop
  2. Создайте 2 потока: один для диалога Windows Forms и один для родного диалога. Здесь вы можете создать диалог в Windows Forms, затем с помощью SetParent() установите родительский элемент в собственный диалог. Но будьте осторожны: если вы добавите TabControl в Windows Forms, то произойдет зависание с «IsDialogMessage() never return».
  3. Создайте обертку для диалогового окна Windows Forms для использования в родном проекте. . Для ех, обертка может быть WPF, смотрите здесь: Windows Form as child window of an unmanaged app

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

Вопрос о IsDialogMessage () в WIN32

December 2020

3.8k раз

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

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

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

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

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

3 ответы

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

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

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

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

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

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

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

Илон Маск рекомендует:  Что такое код getmodulefilename

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

Что такое код isdialogmessage

Petzold seems to say that GetMessage(&msg) only gets a message and the message doesn’t reach winprock (Windows Process Function) until after DispatchMessage(&msg).

Not after DispatchMessage — during DispatchMessage. DispatchMessage calls the window procedure.

The windows documentation for GetMessage:

seems to say that GetMessage is the one that dispatches the message.

You are probably talking about this part: » The function dispatches incoming sent messages until a posted message is available for retrieval.» You need to understand the difference between sent messages (as created by SendMessage) and posted messages (as created by PostMessage).

SendMessage is synchronous — it doesn’t return until the destination window procedure is called. If SendMessage is called by the same thread that created the window in the first place, then it just calls the window proc directly. But if SendMessage is called by a different thread (possibly even in a different process), then it blocks until the target thread «yields» — calls one of the API functions that indicate its readiness to process messages. GetMessage is such function: when the thread calls it, it allows all pending sent messages from other threads to reach the destination window proc, thus unblocking those threads. GetMessage itself doesn’t return until it retrieves a posted message from the queue; it doesn’t dispatch that message.

In contrast, PostMessage is asynchronous — it places a message in the message queue of the thread that the destination window belongs to (which may or may not be the same as the calling thread), and returns immediately. GetMessage doesn’t return until a posted message arrives in the queue (of course, if there are messages already in the queue when GetMessage is called, it just takes the first one of them without waiting). GetMessage doesn’t dispatch that posted message (but, again, it does allow any inter-thread sent messages to reach their destinations).

If I understand correctly IsDialogMessage is used to determine if the message belongs to a dialog box and dispatch the message if it is.

Not quite. IsDialogMessage implements the behavior typical of dialogs — most notably, that Tab key switches focus to the next control in tab order (and Shift-Tab to the previous, and arrows work to move focus between raido buttons in the same radio group, and so on).

You see, a keyboard message (e.g. WM_KEYDOWN) would be posted to a window currently having focus — say, the button control. Now, the button itself doesn’t know what to do with a Tab key, and would just ignore it. So the message needs to be looked at, and acted upon, by something other than the destination window proc. The way Windows solves this problem is by requiring the program to call IsDialogMessage after the message is retrieved and before it’s dispatched (which is one of the reasons why GetMessage and DispatchMessage are two separate functions). IsDialogMessage checks whether the message is a «special» one (e.g. a Tab keypress): if it is, then the function acts on it (e.g. moves focus) and returns TRUE, telling you that the message has been taken care of and shouldn’t be dispatched for further processing; for all other messages, it returns FALSE.

If I understand correctly TranslateAccelerator will return zero if the message is not an accelerator table message so then it has to be handled by TranslateMessage and DispatchMessage.

Yes. TranslateAccelerator is somewhat similar to IsDialogMessage. It too needs to look at keystroke messages — this time to check if the key combination matches an accelerator in the table. If it does, then TranslateAccelerator sends (doesn’t post) a corresponding WM_COMMAND message and returns non-zero. For all other messages, it returns zero (and the program should then dispatch the message as it normally would).

Вопрос о IsDialogMessage () в WIN32

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

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

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

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

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

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

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

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

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

Илон Маск рекомендует:  Работа с хэшами в perl

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

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

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

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

Win32 API. Диалоговые окна

Written on 13 Февраля 2007 . Posted in Win32

ОГЛАВЛЕНИЕ

Создание немодального диалогового окна

Вы создаете немодальный блок диалога, используя функцию CreateDialog, определяя идентификатор или имя ресурса шаблона и адрес процедуры диалогового окна. CreateDialog загружает шаблон, создает диалоговое окно, но необязательно показывает его. Ваша прикладная программа ответственна за извлечение и диспетчеризацию сообщений о вводе пользователя в процедуре диалогового окна.

В следующем примере прикладная программа отображает немодальное диалоговое окно, если оно еще не отображено, когда пользователь выбирает команду Перейти к (Go To) из меню прикладной программы. Диалоговое окно содержит поле редактирования, окошко для отметки «галочкой» и кнопки OK и CANCEL. Шаблон блока диалога — ресурс в исполняемом файле прикладной программы и имеет идентификатор ресурса DLG_GOTO. Пользователь вводит номер строки в поле редактирования и проставляет в окошке для отметки «галочку», чтобы определить, что номер строки — относится к текущей строке. Идентификаторы элементов управления — ID_LINE, ID_ABSREL, IDOK и IDCANCEL.

Операторы в первой части примера создают немодальное диалоговое окно. Эти операторы, в оконной процедуре для главного окна прикладной программы, создают блок диалога, когда оконная процедура принимает сообщение WM_COMMAND, имеющее идентификатор команды IDM_GOTO, но только тогда, если глобальная переменная hwndGoto еще не содержит правильного дескриптора. Вторая часть примера — главный цикл сообщения прикладной программы. Цикл включает в себя функцию IsDialogMessage, чтобы гарантировать, что пользователь может использовать интерфейс клавиатуры блока диалога в этом немодальном диалоговом окне. Третья часть примера — процедура диалогового окна. Процедура извлекает информацию о содержимом поля редактирования и окошка для отметки «галочкой», когда пользователь выбирает кнопку OK. Процедура уничтожает диалоговое окно, когда пользователь выбирает кнопку Отменить (Cancel).

В предшествующих операторах, CreateDialog вызывается только тогда, если hwndGoto, не содержит правильный дескриптор окна. Это гарантирует, что прикладная программа одновременно не отобразит два диалоговых окна. Чтобы поддержать этот метод проверки, процедура блока диалога должна установить hwndGoto в значение ПУСТО (NULL), когда она уничтожает диалоговое окно.

Цикл сообщений для прикладной программы состоит из следующих операторов:

Цикл проверяет правильность дескриптора окна для блока диалога и только тогда вызывает функцию IsDialogMessage, если дескриптор правилен. Функция IsDialogMessage только тогда обрабатывает сообщение, если оно принадлежит диалоговому окну. Иначе, функция возвращает значение ЛОЖЬ(FALSE), а цикл посылает сообщение в соответствующее окно.

Следующие операторы определяют процедуру диалогового окна:

В предшествующих операторах процедура обрабатывает сообщения WM_COMMAND и WM_INITDIALOG. В ходе обработки WM_INITDIALOG, процедура инициализирует окошко для отметки «галочкой», передавая текущее значение глобальной переменной fRelative в CheckDlgButton. Затем процедура возвращает значение ИСТИНА (TRUE), чтобы заставить Windows установить фокус ввода данных по умолчанию.

В ходе обработки WM_COMMAND, процедура закрывает диалоговое окно только тогда, если пользователь выбирает кнопку Отменить (Cancel) — то есть кнопку, имеющую идентификатор IDCANCEL. Процедура должна вызвать DestroyWindow, чтобы закрыть немодальное диалоговое окно. Обратите внимание, что процедура также устанавливает переменную hwndGoto в значение ПУСТО (NULL), чтобы гарантировать, что другие операторы, которые зависят от этой переменной, действуют правильно.

Если пользователь выбирает кнопку OK, процедура извлекает информацию о текущем состоянии окошка для отметки «галочкой» и присваивает ее переменной fRelative. Затем она использует эту переменную, чтобы извлечь данные о числе строк в поле редактирования. Функция GetDlgItemInt переводит текст в поле редактирования в целое число. Значение fRelative определяет, правильно ли понимает функция число как знаковое или беззнаковое значение. Если текст поля редактирования — не правильное число, GetDlgItemInt устанавливает в переменной fError значение отличное от нуля. Процедура проверяет это значение, чтобы определить, или показать сообщение об ошибке или завершить команду. В случае ошибки, процедура диалогового окна передает сообщение полю редактирования, предписывая ему выбрать текст в элементе управления так, чтобы пользователь мог его легко заменять. Если GetDlgItemInt не возвращает ошибку, процедура может или завершить затребованную команду самостоятельно или передать сообщение окну владельцу, предписывая ему завершить команду.

Что такое код isdialogmessage

Қайтар- мағына
Анықта- ма атқаратын қызметім айтылмыш хабарламаны өңдеді. Өте жақсы нуля егер хабарлама өңде- болды, әйтпесе 0. Қайтарым — 0 шақыртсам CWnd::PreTranslateMessage негіздік сыныптың атқаратын қызметін өңдеу чтобы хабарлама. Асыра тиелгенде CWnd::PreTranslateMessage атқаратын қызметіме код келесі бейнемен : көрінеді

Параметрлер
lpMsg
Сілтегіш құрылымға MSG нешінші хабарламаны асырайды нешінші тексер- бол-.

Ескертпелер
Шақырт- осы атқаратын қызметімді анықтау чтобы ма айтылмыш хабарлама немодального диалогтың терезесі үшін егер арнаулы сол атқаратын қызметім хабарламаны өңдейді. Қашан атқаратын қызметім IsDialogMessage өңде- хабарламаны ол клавиатуры хабарламаларын тексереді және оларды талғамның командаларына лайықты диалогтың терезесі үшін преобразовывает. Айталық, қарамастан Tab сайла- келесі элементті басқарма немесе басқарманың элементінің тобын, ал «төмен» деген стрелки батырмасы басқарманың келесі элементін топта сайлайды.Сендер хабарлама өңде- жұқтыруға керекке IsDialogMessage арада ::TranslateMessage қарамастан немесе атқаратын қызметтерім DispatchMessage Windows, себебі ол уже өңде- болды.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL