场景描述:MFC对话框程序中的picture控件中显示动态图像,并通过鼠标点击获取图像中任意像素的坐标。
首先创建自定义类,通过派生Cwnd类实现在picture控件中绘图从而显示图像,在该类中定义一个鼠标单击事件,其返回的是点击位置相对图像原点的坐标,而非整个对话框的原点。然后希望在对话框中响应该鼠标点击事件,但因为是窗口派生类内部的消息导致不能响应。
重载PreTranslateMessage函数无法解决该问题,最后通过自定义消息得到解决。思路很简单,建立一个自定义消息,在派生类的鼠标单击事件内部发送该消息,在对话框建立消息响应函数,从而实现事件触发。
添加自定义消息的步骤如下,假设A为发送方,B为接受方:
1、首先在A的头文件中定义这个消息:
#define WM_USERMESSAGE WM_USER+30
WM_USERMESSAGE可以改为自己的名字,所有自定义消息都是以WM_USER消息为基础加上一个任意的自然数来表示的
2、在A中需要B响应的事件处理函数中,发送消息:
GetParent()->SendMessage(WM_USERMESSAGE,a,b);
a和b的类型分别是wParam和lParam,均为32位整型变量。对其的详细分析http://zhidao.baidu.com/link?url=HF9XA-THqrx-_xaq9dCywbynkgw_8KYSv2Kj2nh4l_IZV0SfrG34KKrI32mzyCo1TvieJklfhjJ5OQ5LsSwXNq
3、在B的头文件中定义同一个消息:
#define WM_USERMESSAGE WM_USER+30
4、为B添加消息处理函数:
afx_msg LRESULT OnProcName( WPARAM wParam, LPARAM lParam );
OnProcName可以使用自己的名字
5、在实现文件中加上接受消息映射的宏
在cpp文件里,BEGIN_MESSAGE_MAP语句之后,在一对AFX_MSG_MAP之间,增加 如下形式的代码:
ON_MESSAGE(WM_USERMESSAGE, OnProcName)
上面是不用分号结尾的。WM_USERMESSAGE对应自定义消息名,OnProcName是消息处理函数
6、编写消息处理函数
响应该消息后要做的事情