我遇到了一些我认为是由对话过程中的消息排序引起的麻烦。为了避免更多的全局变量,我在对话框中添加了一条 WM_USER 消息来设置控件的颜色。消息处理代码只是将 COLORREF 存储在一个静态变量中。在 INITDIALOG 中,我做了一个 SendMessage(hDlg,WM_User...) (到对话框本身),然后是一个 SetDlgItemText 用于对话框中的静态控件。WM_CTLCOLORSTATIC 消息处理代码设置静态控件的颜色、背景颜色和字体。一切似乎都按预期工作,直到我用任务栏中的另一个应用程序覆盖了该应用程序。当我重新建立应用程序时,隐藏的静态控件部分从所需的颜色变为黑色。请注意,WM_CTLCOLORSTATIC 消息也更改的字体大小不受影响。无法重新生成此信息,因此 Windows 对话框处理必须将其保存在某处。由于应用程序和 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_CTLCOLORSTATIC 消息之前和之后的 WM_SETTEXT 消息。我想其他消息,如 WM_COMMAND/EN_CHANGE 也会生成和处理。
如果是这种情况,我看不出是什么导致了我的问题,也看不出是如何通过消除 SendMessages 来解决的。