VC中自定义消息的处理

 由于在实际的项目中一直没用用过自定义消息完成某功能,所以虽然以前看书了,知道怎么做但是早还给课本了。
今天想实现这样一个功能,查了查资料记录下来。

另外VCbase上有个简单的示例。

开始时要明白windows消息投递有2种方式:

PostMessage   和SendMessage的区别主要在于是否等待其他程序消息处理。PostMessage只是把消息放入队列,不管其他程序是否处理都继续执行,而 SendMessage必须等待其他程序处理消息后才继续执行。这两个函数的返回值也不能,PostMessage的返回值表示PostMessage函 数执行是否正确,而SendMessage的返回值表示其他程序处理消息后的返回值。   


1、肯定是定义消息了这个很easy。 #define WM_XXX WM_USER+100 建议从100开始,因为可能有些新的控件用了WM_USER+1

2、在将要处理的对话框类中加入对应的消息响应函数。
     在.h 中加入函数声明 afx_msg bool Ondo(WPARAM wp); 
     然后再.cpp的BEGIN_MESSAGE_MAP和END_MESSAGE_MAP中加入ON_MESSAGE(WM_XXX, Ondo)
     最后实现这个函数。
    这里需要说明的是如果像上面那样写的话,VC7、8以后的编译器都会报错,好像VC6不会。
    错误信息如下:
error   C2440:   “static_cast”   :   无法从“LRESULT   (__thiscall   Ondo::*   )(WPARAM)”转换为“LRESULT   (__thiscall   CWnd::*   )(WPARAM,LPARAM)” 
    这里需要这么做:
    将函数的返回值修改为LRESULT,同时将参数改为WPARAM,LPARAM 。也就是这么实现
   afx_msg LRESULT Ondo(WPARAM wParam, LPARAM lParam);
3,最后在子对话框里必须知道该自定义消息发送到哪个窗口中,如果你在父对话框中采用
DoModal();的话,虽然子窗口的构造函数有参数是父窗口的CWnd,但是它是NULL。所以可以这么做
在子窗口中调this->GetParent();如果有多个子窗口,可以一直掉他的GetParent直到得到该消息的目的窗口。

虽然简单的问题,但是2和3都是我遇到的,解决了2、3程序就顺利的完成了我要实现的功能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值