liujiajun05的个人博客分享 http://blog.sciencenet.cn/u/liujiajun05

博文

非模态对话框对消息的响应

已有 7716 次阅读 2010-11-22 12:47 |个人分类:vc编程|系统分类:科研笔记

这件事情的动机是,之前编写了一个程序,基于VC++(2008)对话框,后来发现这个程序不错,想把它整合到一个更大一些的单文档程序当中。

但是有点悲剧的是,这个对话框程序之中有一个类似于消息响应一样的机制:在从外部硬件接收到信息的时候这个对话框程序会调用一个函数,初步判断是基于消息响应的。

如果在这个单文档程序当中以一个模态对话框的方式进行创建的话,那么在点击诸如“确定”“取消”等等按钮的时候,这个对话框就彻底的关闭了,那么如果硬件收到消息,那么也就不会去执行相应的函数了。

所以才想到去建立一个非模态的对话框去完成这个工作。

基本上移植得还算是顺利,之前也想看一下,如果非模态对话框被关闭但是没有销毁之后是否还能够相应父窗口发送的消息,试验了一下是可以的,只要在父窗口(我这里是view类)中写上:

::SendMessage(xxxx->GetSafeHwnd(), ****,0,0);

就可以了,xxxx是创建的非模态对话框的指针,而****则是发送消息的定义

另外还需要在这个非模态对话框当中定义一下响应消息的函数

添加消息响应函数有三个地方要动:

第一:自定义一个消息出来,也就是上面的那个****,这里是在非模态对话框的那个类定义的头文件当中写:

#define **** WM_USER+1000,那个WM_USER是程序里专门为自定义消息准备的一个号码,避免和系统消息重叠,这里再加1000也是避免重叠导致冲突的手段

第二:自定义一个函数,注意,函数叫什么无所谓,但是返回值和参数一定要是下列形式:(我选择在这个类当中把这个响应函数定义成public类型)

afx_msg LRESULT 函数名称(WPARAM wParam, LPARAM lPara);

所以说在消息响应函数当中用到的参数包括了这个类当中定义的所有成员变量,这个函数的参数我也没有深究是啥东西,有研究的朋友请不吝赐教

第三:建立消息映射

就是在对应的.cpp文件中有一段以BEGIN_MESSAGE_MAP开头,END_MESSAGE_MAP()结尾的东西,中间插入一句:

ON_MESSAGE(****, &CDlgMsgMonitor::OnSend_Cell_Message)

这里****依然是那个消息,而后面的,由于我的这个类叫做CDlgMsgMonitor,而我的响应函数是这个类的成员函数,函数名称是OnSend_Cell_Message,所以就这么写了

这三步结束之后就可以通过SendMessage或者PostMessage发出消息来进行相应了

另外也看到说模态和非模态对话框响应消息的区别这种东西,提到了要修改消息循环云云,暂时也没搞懂,有行家的话请通俗一点的指教一下……不胜感激



https://blog.sciencenet.cn/blog-417390-386267.html

上一篇:机器人学科的顶级期刊-会议(欢迎补充)
下一篇:编程添加工具栏的位图按钮
收藏 IP: .*| 热度|

2 唐常杰 杨华磊

发表评论 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-26 22:13

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部