MFC中消息机制的具体操作方法

在MFC中,消息机制是非常重要的,无论是点击按钮,光标选择,都是依靠消息机制实现的,那么如果自定义自己的消息机制呢?
我所知道的自定义消息机制的方式有两种,先记录下来

控件产生的消息

  • 如果你想要让控件产生一些默认操作的消息,比如按钮左键按下,产生一个消息,执行按下的回调函数,又比如列表控件下拉时产生对应的消息。总之这些消息产生的原因或者说动作都是MFC已经自定义好的,那么最简单的可以在UI界面直接选中控件,然后在属性中的事件栏下(或者右击,选择添加事件处理程序),选择对应的消息,然后MFC会自动帮你创建一系列消息的定义,你只需要在对应的回调函数中填写对应的消息响应内容即可。
  • 但是如果不想让系统帮你创建,你想要的自定义,那么首先在UI界面创建控件(这一步中,系统会自动在Resource.h文件中帮你创建消息ID,然后在.rc文件中,加入该控件具体的样式信息,位置信息等),接着在你想要的响应消息的类中加入消息响应函数的定义和声明(函数声明一定要以afx_msg宏定义开头),最后在该类源文件中的BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间加入对应的消息,消息类型和消息响应函数三者的关联。如下:
 ON_COMMAND(ID_SIMULATION_MULTI, MutilThreadSimulation)

第一个参数ON_COMMAND是消息类型的说明,具体可以参考这篇博客:https://blog.csdn.net/CNHK1225/article/details/47087879
第二个参数ID_SIMULATION_MULTI是消息ID,就是在Resource.h中定义的
第三个参数MutilThreadSimulation就是消息响应函数了,如果消息产生,就会调用这个函数
这样一个控件产生的消息就完成了,不过个人建议还是让MFC自己去创建这样默认操作的消息

自定义消息

这一类消息所有都是你自定义的,无论是消息产生的事件,还是消息响应函数,消息ID,都是依靠自己定义的。
整个过程如下:
首先在Resource.h中定义消息ID
然后在需要响应消息的类中加入消息响应函数的声明和定义(其实我觉得消息应该加在哪个类当中,主要是看你需要用到哪个类的资源,你就加到哪个类中,毕竟消息响应函数是这个类的成员函数,可以方便直接地运用这个类的变量和和函数),以及在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间加入对应的绑定关系。
这里有几点需要注意:

  • 自定义消息响应函数是有模板的,必须是如下这种格式:
LRESULT CSampleHView::MutilThread_message2(WPARAM wp, LPARAM lp)

其中
wParam通常是一个与消息有关的常量值,也可能是窗口或控件的句柄
lParam通常是一个指向内存中数据的指针。由于WParm、lParam和指针都是32位的,因此,它们之间可以相互转换

  • 在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间加入的语句中,第一个参数一定要是ON_MESSAGE

最后在你需要触发消息的地方,比如说子线程中,调用::SendMessage或者::PostMessage,就可以触发了。
其中::SendMessage是等消息回调函数执行结束,再继续执行::SendMessage语句下面的程序,而::PostMessage则是不管消息回调函数是否执行,就直接执行下面的程序。

LRESULT SendMessage(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM IParam);
hWnd:其窗口程序将接收消息的窗口的句柄,或者是接收消息类的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
wMsg:消息ID
wParam:消息回调函数的第一个参数值
lParam:消息回调函数的第二个参数值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值