您的位置:首页 > 其它

VC中自定义消息的处理

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

另外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程序就顺利的完成了我要实现的功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: