最近在使用vs2012学习MFC多个对话框编程的过程中,遇见了一个问题:点击子对话框中的按钮没有触发消息响应函数,这个问题我曾在优快云中发帖求助过,链接为:https://bbs.youkuaiyun.com/topics/392420801,这里面有我的创建过程,这里不再赘述。
关于如何解决这个问题,我尝试过很多可能性:
1.网上有人说是对话框属性设置的问题,Disabled要设置为false,Client Edge 设置为true,Clip Sibling设置为true。但是试了这些方法,并没有解决问题。
2.也有人说是消息响应机制的问题,但是这些都是在程序员添加事件处理程序之后,vs自己生成的函数。
3.窗口创建的问题,在初始化函数创建子对话框的函数SetWindowPos的参数没有设置好。帮助文档中关于SetWindowPos的说明是这样的:
参数解释如下:
我按照自己的需求,将子对话框1和2的SetWindowPos参数设置如下:
Dialog1.SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOSIZE);
Dialog2.SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOSIZE);
然而问题也没有解决。
最后,在尝试各种方法无果之后,我将我的程序发给了我的老师并向她请教,她使用的是vs2017,点击子对话框的控件也没有响应到消息函数。
后来,她自己写了一个多对话框的程序给我看了下,看完之后,我隐约感觉到了问题的所在,大家请看下面这段代码,这是我自己创建两个对话框对象的程序:
CDialog Dialog1;
CDialog Dialog2;
这是在主对话框的头文件中声明的,而我老师的程序代码确是这样的:
CChildDlg childDlg1;
CChildDlg2 childDlg2;
我意识到很有可能就是这个地方出现了问题,我老师创建的两个对象的类是通过类向导给子对话框添加的,然后在主对话框的头文件中包含子对话框的头文件并创建这两个对象,这才是将子对话框添加进来了,而我的做法只是创建了两个“CDialog”对话框,并没有将之前在资源视图中添加进的对话框与主对话框之间关联起来。(这个地方可能由于作者水平有限,表达的不是很准确,欢迎大家指正)。随后我将代码改成这样:
最终,问题得以解决,而且发现,各个对话框之间的控件消息是相互独立的,可以通过PreTranslateMessage函数测试一下。