在我们创建基于对话框的应用程序的时候,常常在WM_SIZE消息的响应函数OnSize()函数对窗口重新布局,有时,我们会发现OnSize函数在OnInitDialog 函数之前被调用,这个时候对话框并未被创建,我们常用的作法是在OnSize函数中使用IsWindow进行判断,可规避这个问题。由于当时没有深入思考这个问题的原因,所以一直也就这样处理,直到今天查看别人的程序时,发现和自己的有区别,看代码都差不多,没找出什么区别,于是对比对话框的属性对话框,终于发现了差异,那就是设置对话框的风格时,选择的不一样。顺便百度了一下,找到了解释。
Sometimes you want to write a simple dialog-based program in MFC.
You may handle WM_SIZE to do some re-layout.
Occasionally, you might find that the OnSize methods is called before OnInitDialog !
Thus, when you moving control around in OnSize, you will get a access violation.
That's because the control is NOT created yet. It seems very very weird.
After some experiment, I found that if you change the dialog style from Popup to Overlapped,
above two methods will called in right order.
在MFC对话框程序中当对话框的样式是Popup时,对话框将在OnInitDialog之前收到一个WM_SIZE,
而此时对话框还没创建完毕。此时操作对话框上的控件将产生错误。解决办法就是将对话框样式改为
Overlapped