资源描述:
《vc_添加自定义消息及消息处理函数分5步及详解》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、1.在要添加消息的类头文件中定义宏 #defineWM_xxxWM_USER+n(n>=0);2.在类的声明中添加消息处理函数的声明 afx_msgvoidxxxx(WPARAMwParam,LPARAMlParam);3.在类的实现文件中消息映射部分添加消息映射 ON_MESSAGE(WM_xxx,xxxx);4.自己编写消息处理函数。5.在要发送此消息的函数中调用函数BOOLPostMessage( HWNDhWnd, //handleofdestinationwindow UINTMsg, //messagetopost W
2、PARAMwParam, //firstmessageparameter LPARAMlParam //secondmessageparameter);把消息送到消息队列中。最近在用VC2008做开发,后来由于要用到消息的发送,而且需要自定义消息,在网上查找了很多例子,根据他们所说的,虽然大致都差不多,但是基本上没有一个能完全做出来的。要知道VC编程有一个小地方出错,都可能是个让你头晕脑胀的事情。经过我后来不但探索,经过改进之后,一点错误都没有,现在贴出来供大家参考。 1.先来个基本知识介绍SendMessage的基本结构如下:SendM
3、essage( HWNDhWnd, //消息传递的目标窗口或线程的句柄。 UINTMsg, //消息类别(这里可以是一些系统消息,也可以是自己定义,下文具体介绍,) WPARAMwParam,//参数1(WPARAM其实是与UINT是同种类型的, //在vc编译器中右键有个“转到WPARAM的定义”的选项可以查看。 LPARAMlParam);//参数2其中一些参数的由来如下://typedefunsignedintUINT;//typedefUINTWPARAM;//typedefLONGLPARAM;//typedef
4、LONGLRESULT;2. SendMessage用法实例 例如可以用以下语句:voidCTScrollWinView::OnLButtonDblClk(UINTnFlags,CPointpoint) { //TODO:在此添加消息处理程序代码和/或调用默认值 ::SendMessage(AfxGetMainWnd()->m_hWnd,WM_CHILDFRAMEDBCLK,0,0); CScrollView::OnLButtonDblClk(nFlags,point); }这是我
5、用VC2008下建立的一个多文档选项卡式工程里面的一段代码,是为了实现在子窗口双击后发送一个不带参数的消息(其ID为WM_USER+1)给主窗口,如上为部分代码,其中WM_CHILDFRAMEDBCLK是自定义的消息ID,AfxGetMainWnd()->m_hWnd是获得主窗口(这里不能使用GetParent()->m_hWnd或者GetParentFrame()->m_hWnd,因为这是获得父窗口,但父窗口不一定是主窗口,一定要注意,不然消息就会发错导致接收不到,我这里卡了半天,后来在QQ群里一位大侠告诉我的,在此再感谢一下那位大侠);3.在接收
6、消息的窗体以及线程所在的头文件里定义:#defineWM_CHILDFRAMEDBCLK WM_USER+1 //dosomething4.然后接下来定义一个消息需要映射的函数,如下:afx_msgLRESULTOnChlidFrameDBClick(WPARAMwParam,LPARAMlParam);注意格式必须是:两个参数必不可少,返回类型一定为LRESULT,网上很多文章都忽略了这两点,这也是网上文章普遍错误的地方。5.添加消息函数映射 ON_MESSAGE(WM_CHILDFRAMEDBCLK,OnChlidFrameDBClic
7、k) 注意这里必须是ON_MESSAGE,不能使用ON_COMMAND,前者主要针对用户自定义消息,后者针对WM_COMMAND命令,比如菜单、工具栏等.6.实现消息函数:我们在接收窗体里定义一个这样的事情(过程),LRESULTCMainFrame::OnChlidFrameDBClick(WPARAMwParam,LPARAMlParam) { CancelFullScreenWin(); //这里调用了一个使子窗口全屏的自写函数,我就不贴出来了,以后专题将的时候会提到 return0;
8、 } 7.下面是部分代码,要想搞清楚自定义消息发送只看这部分代码就足够了在MainFrm.h头文件里定义了消