对话程序消息排序

时间:2011-07-25 13:23:23

标签: windows winapi modal-dialog windows-messages

我遇到了一些麻烦,我认为是由对话程序中的消息排序引起的。为了避免更多的全局变量,我在对话框中添加了一条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来查看导致我的问题的原因或解决方法。

1 个答案:

答案 0 :(得分:1)

事实证明,Windows中的某些内容也发送WM_USER消息,更改为WM_APP 解决了我的问题。我仍然对消息的排序感到好奇,以防任何人想要回应

请参阅WM_USER obsolete, use WM_APP