概述
http://blog.csdn.net/ztz0223/article/details/2058402
http://blog.csdn.net/a8082649/article/details/7733527
http://bbs.csdn.net/topics/100117277
http://blog.csdn.net/gukesdo/article/details/6754823
Vc中自定义消息及其触发使用
如何在VC++中加入自定义消息,我的做法:
这里我以一个对话框为例子,环境:VS 2008,新建一个工程,选择对话框:以编译器给出的对话框为蓝本,自己新建一个按钮如图:
把名字改成如图的,其他比如ID什么的都不改了,默认。
1 首先在ownermessageDlg.h中定义消息:例如
define WM_MYMESSAGE (WM_USER+100)
2 在.H文件中,加入消息响应函数,如:
afx_msg LRESULT OnMyMessage(WPARAM w,LPARAM l);
该函数有规定的格式:
afx_msg LRESULT Function_Name(WPARAM w,LPARAM l);
3 在ownermessageDlg.cpp中加入消息响应宏
在响应该消息的类中,在消息响应块中,
BEGIN_MESSAGE_MAP(CownermessageDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
加入以下语句:
ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)
成为如下样式:
BEGIN_MESSAGE_MAP(CownermessageDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_MYMESSAGE,OnMyMessage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
4 在.CPP文件中,编辑消息响应函数,如下:
LRESULT CownermessageDlg::OnMyMessage(WPARAM wParam, LPARAM lParam) {
MessageBox(_T("My Message!"));
return 1;
}
5.在对话框中为新增的按钮添加单击响应,ownermessageDlg.cpp中的MESSAGE_MAP变成:
BEGIN_MESSAGE_MAP(CownermessageDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_MYMESSAGE,OnMyMessage)
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON1, &CownermessageDlg::OnBnClickedButton1)
END_MESSAGE_MAP()
void CownermessageDlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
//::PostMessage(
PostMessage(WM_MYMESSAGE, IDC_BUTTON1);
}
6.子线程里也可以向UI线程发送消息
void CTestThreadDlg::OnBnClickedOk()
{
// TODO: Add your control notification handler code here
//AfxBeginThread(MyThread,this);
::AfxBeginThread( MyThread, (LPVOID) this);
Sleep(10);}
UINT CTestThreadDlg::MyThread(LPVOID lpstr)
{
CTestThreadDlg* pDlg;
pDlg=(CTestThreadDlg*)lpstr;
::PostMessage(pDlg->m_hWnd,WM_MYMESSAGE,0x30,NULL);
Sleep(100);
return 0;
}
PostMessage(……)这个就是响应WM_MYMESSAGE消息的,其实这样写也是可以的:
PostMessage(WM_MYMESSAGE);
我们来看看这个消息的函数原型:
在CWnd::PostMessage中定义
BOOL PostMessage (
UINT message,
WPARAM wParam = 0,
LPARAM lParam = 0
);
Parameters:
message
Specifies the message to be posted.
wParam
Specifies additional message information. The content of this parameter depends on the message being posted.
lParam
Specifies additional message information. The content of this parameter depends on the message being posted.
Return Value
Nonzero if the message is posted; otherwise 0.
所以一般的当点击时,消息触发就会发送一个WM_MYMESSAGE消息,故而调用CownermessageDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)这个函数。
SendMessage也可以实现消息发送,不同的是SendMessage函數是阻塞的。PostMessage函數是非阻塞的。SendMessage只有在对应的类处理完发送的消息后才返回,这样后面的代码可能要过一段时间才能执行;
而PostMessge是发送完消息就立即返回,不管消息处理完没有,这样后面的代码就可以立即执行。
最后
以上就是无私黑猫为你收集整理的Vc/MFC中自定义消息及其PostMessage触发使用的全部内容,希望文章能够帮你解决Vc/MFC中自定义消息及其PostMessage触发使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复