У меня возникли проблемы из-за последовательности сообщений в диалоговой процедуре. Пытаясь избежать большего количества глобальных переменных, я добавил сообщение 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.