последовательность сообщений диалоговой процедуры - PullRequest
0 голосов
/ 25 июля 2011

У меня возникли проблемы из-за последовательности сообщений в диалоговой процедуре. Пытаясь избежать большего количества глобальных переменных, я добавил сообщение WM_USER в свой диалог, чтобы установить цвет элемента управления. Код обработки сообщений просто хранит COLORREF в статической переменной. В INITDIALOG я сделал SendMessage (hDlg, WM_User ...) (для самого диалога), а затем SetDlgItemText для статического элемента управления в диалоге. Код обработки сообщений WM_CTLCOLORSTATIC устанавливает цвет, цвет фона и шрифт для статического элемента управления. Казалось, что все работает, как ожидалось, пока я не наложил приложение с другим из панели задач. Когда я восстановил приложение, скрытая часть статического элемента управления изменила цвет с желаемого на черный. Обратите внимание, что размер шрифта, также измененный сообщением WM_CTLCOLORSTATIC, не был затронут. Эта информация не может быть восстановлена, поэтому обработка диалогового окна должна где-то ее сохранять. Это, конечно, невозможно отладить из-за взаимодействия между приложением и Visual Studio. Когда я заменил метод SendMessage для отправки цвета, просто установив глобальную переменную, проблема исчезла.

Итак, мне любопытно, какие сообщения отправляются в диалог и в каком порядке они отправляются? MSDN говорит, что SendMessage не возвращается, пока сообщение не будет обработано окном. Поэтому я думаю, что сообщения должны выглядеть следующим образом

WM_INITDIALOG starts

  WM_USER starts             (caused by the SendMessage call)
  WM_USER ends

  WM_CTLCOLORSTATIC starts   (caused by the SetDlgItemText call)
  WM_CTLCOLORSTATIC ends

WM_INITDIALOG ends

Тем временем статический элемент управления обрабатывает сообщение WM_SETTEXT до и после сообщений WM_CTLCOLORSTATIC. Я предполагаю, что другое сообщение, такое как WM_COMMAND / EN_CHANGE, также генерируется и обрабатывается.

Если это так, я не вижу, что вызвало мою проблему или как она была устранена путем устранения SendMessages.

1 Ответ

1 голос
/ 25 июля 2011

Оказывается, что-то в windows тоже отправляло сообщения WM_USER, меняя на WM_APP исправил мою проблему. Мне все еще любопытно относительно последовательности сообщений на случай, если кто-то захочет ответить на это

См. WM_USER устарел, используйте WM_APP

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