您的位置:首页 > 其它

MFC 自定义消息响应基本步骤

2014-07-08 16:51 232 查看
MFC 自定义消息响应基本步骤:

准备发消息为类A,响应消息的为类B
第一步:在类A.h文件中定义消息(加在.cpp中也可以)

#define (自定义消息名) WM_USER+1001

eg:#define WM_MYMESSAGE WM_USER+1001

eg2:#define WM_MESSAGE_vioce WM_USER+103//2014

第二步: 类A 中发送消息

eg1: HWND hwnd = ::GetParent(m_hWnd);

::SendMessage(hwnd,WM_MYMESSAGE,a,b);

或者用PostMessage(,,,);

eg2:HWND hWnd = ::FindWindow(NULL,"采集"); //2014”采集“运行后的窗体名称

::PostMessage(hWnd,WM_MESSAGE_vioce,103,0);

第三步:在类B.h文件中定义消息

#define (自定义消息名) WM_USER+1001

eg:#define WM_MYMESSAGE WM_USER+1001

eg2:#define WM_MESSAGE_vioce WM_USER+103//2014
第四步:在要响应的类B的.h文件的AFX_MSG块中声明消息处理函数

eg: afx_msg LRESULT ONMYMessage(WPARAM wParam, LPARAM lParam);
eg2:afx_msg LRESULT Onvioce(WPARAM wParam, LPARAM lParam);//2014

第五步:再要响应的类的类B.cpp文件中增加消息映射部分:

eg: ON_MESSAGE(WM_MYMESSAGE, ONMYMessage)
eg2:ON_MESSAGE(WM_MESSAGE_vioce, Onvioce) //2014

第六步:在要响应的类的类B.cpp中定义消息处理函数的实现:

eg:LRESULT 类名::ONMYMessage(WPARAM wParam, LPARAM lParam)

{

对应的处理;

}

eg2:LRESULT CMainFrame::Onvioce(WPARAM wParam, LPARAM lParam) //2014
{
响应消息后做你想做的
}

************************************************************

************************************************************

自定义消息的简单应用

一:在要发送和响应的类的.h文件中添加自定义的消息

#define WM_MYMESS WM_USER+1002

二:在要响应的类中添加

LRESULT Ctest4Dlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)

{

if(mesaage==WM_MYMESS)

{

做相关处理;

可以直接通过wParam 和 lParam的到相应消息发送的值

}

return CDialog::DefWindowProc(message, wParam, lParam);

}

DefWindowProc(HWND hWnd.UINT Msg,WPARAM wParam,LPARAMIParam), 是让Windows的缺省消息处理函数处理消息.

或者

LRESULT CallWindowProc(WNDPROC lpPrevWndFunc,HWND hWnd.UINT Msg,WPARAM,wParam,LPARAMIParam);

像上面一样定义消息响应函数名 进行使用

函数功能, CallWindowProc将指定消息信息传送给指定的窗口过程. lpPrevWndFunc是窗口消息处理函数指针(函数名), hWnd为接受窗体句柄.

三:使用sendmessage 和postmessage发送消息

区别:

1, PostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行,这是个异步消息投放函数。而SendMessage必须等待其他程序处理消息完了之后才返回,继续执行,这是个同步消息投放函数。而且,PostMessage的返回值表示PostMessage函数执行是否正确;而SendMessage的返回值表示其他程序处理消息后的返回值。这点大家应该都明白。
2, 如果在同一个线程内,PostMessage发送消息时,消息要先放入线程的消息队列,然后通过消息循环Dispatch到目标窗口。SendMessage发送消息时,系统直接调用目标窗口的消息处理程序,并将结果返回。SendMessage在同一线程中发送消息并不入线程消息队列。
如果在不同线程内。最好用PostThreadMessage代替PostMessage,他工作的很好。
SendMessage发送消息到目标窗口所属的线程的消息队列,然后发送消息的线程等待(事实上,他应该还在做一些监测工作,比如监视QS_SENDMESSAGE标志),直到目标窗口处理完并且结果返回,发送消息的线程才继续运行。这是SendMessage的一般情况,事实上,处理过程要复杂的多。比如,当发送消息的线程监测到有别的窗口SendMessage一个消息到来时,他直接调用窗口处理过程(重入),并将处理结果返回(这个过程不需要消息循环中GetMessage等的支持)。
3, msdn: If you send a message in the range below WM_USER to the asynchronous message functions (PostMessage, SendNotifyMessage, and SendMessageCallback), its message parameters can not include pointers. Otherwise, the operation will fail. 如果发送的消息码在WM_USER之下(非自定义消息)且消息参数中带有指针,那么PostMessage,SendNotifyMessage,SendMessageCallback这些异步消息发送函数将会调用失败。
最好不要用PostMessage发送带有指针参数的消息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: