MFC中发送自定义消息机制,PostMessage和SendMessage方式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27278957/article/details/78636228

       MFC中有种消息队列,使用PostMessage()或者SendMessage()给窗体发送自定义消息,当窗体接收到消息时调用该消息对应绑定的方法。

PostMessage:把消息投放到线程的消息队列,不等消息被处理就立即返回;
SendMessage:消息被处理完后才返回,所以后面的代码不能立即执行;

具体实现方法:

1、首先在CMyMessageDlg.h定义消息:例如

define WM_MYMESSAGE (WM_USER+100)

WM_USER为windows系统为非系统消息保留的ID,这里至少要用100(也可以以0x100这种形式),因为其它控件的消息会占用一部分。

 

2、在.H文件中,加入消息响应函数,如:

afx_msg LRESULT OnMyMessage(WPARAM w,LPARAM l);

该函数有规定的格式:

afx_msg LRESULT Function_Name(WPARAM w,LPARAM l);


3 在CMyMessageDlg.cpp中加入消息响应宏

在响应该消息的类中,在消息响应块中,

BEGIN_MESSAGE_MAP(CMyMessageDlg, CDialog)

   ON_WM_SYSCOMMAND()

   ON_WM_PAINT()

   ON_WM_QUERYDRAGICON()

   ON_MESSAGE(WM_MYMESSAGE,&CMyMessageDlg::OnMyMessage)

   //}}AFX_MSG_MAP

END_MESSAGE_MAP()


4 在.CPP文件中,编辑消息响应函数,如下:

LRESULT CMyMessageDlg::OnMyMessage(WPARAM wParam, LPARAM lParam) {

   MessageBox(_T("My Message!"));

   return LRESULT (0);

}


5、在程序中使用PostMessage(WM_MYMESSAGE , NULL, NULL)

在子线程中也可以使用PostMessage(),给主线程发送消息触发方法。


几种发送消息的写法:
   ::PostMessage(GetSafeHwnd(),WM_MYMESSAGE , 0, 0); //GetSafeHwnd()表示得到当前窗口句柄,所以这条语句是发送给当前窗口
   GetParent()->PostMessage(WM_MYMESSAGE , 0, 0);//发送给父窗口 
   this->PostMessage(WM_MYMESSAGE , 0, 0);//发送给当前窗口

   HWND h= ::FindWindow(NULL, _T("窗口名字"));
   ::PostMessage(h,WM_MYMESSAGE , 0, 0);//发送给任意窗口

SendMessage也是同样的用法。








猜你喜欢

转载自blog.csdn.net/qq_27278957/article/details/78636228
今日推荐