在多线程的程序中,有时需要在子线程中使用UpdateData()函数对主窗口进行更新,但是在子线程里调用UpdateData()函数是行不通的,这就需要使用自定义消息来进行线程间的通信,在此记录怎么使用自定义消息。
在Visual C++中提供了WM_USER,比它大的整数可以由用户使用,比它小的整数由系统保留。
自定义消息处理的过程如下:
1、声明一个全局的常量,代码如下:
const WM_xxx = WM_USER + N;
其中,WM_xxx表示自定义的消息名,N是正整数。
2、在对话框的头文件中DECLARE_MESSAGE_MAP()的前面添加下列语句:
//{{AFX_MSG(CXXXDlg)
...
afx_msg LONG OnXXXX(WPARAM wParam, LPARAM lParam); //消息处理函数的声明,OnXXXX可自行命名
...
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
3、切换到对话框类的实现文件中,在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间添加消息映射代码:
BEGIN_MESSAGE_MAP(CXXXDlg, CDialog)
//{{AFX_MSG_MAP(CQQDlg)
...
ON_MESSAGE(WM_xxx,OnXXXX) //WM_xxx就是第1点中声明的全局常量,OnXXXX就是第2点声明的消息处理函数
...
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
4、在对话框类的实现文件中添加消息处理函数的实现代码,大致如下:
LONG CXXXDlg::OnXXXX(WPARAM wParam, LPARAM lParam)
{
switch(wParam)
{
case 情况1:
{
UpdateData(lParam);
break;
}
case 情况2:
{
//消息处理
break;
}
.....
default:
break;
}
}
5、现在就可以向主线程发送消息了,Windows提供了两个发送消息的函数:SendMessage和PostMessage。
(1) SendMessage:该函数只有等消息被处理完以后才可以返回。其函数原型为:
LRESULT SendMessage(HWND hWnd, UINT message, WPARAM wParam=0, LPARAM lParam=0);
hWnd:其窗口程序接收消息的窗口的句柄。
message:指定要发送的消息。
wParam:指定额外消息依赖的信息。
lParam:指定额外消息依赖的信息。
LRESULT:表示一个窗口过程返回值的类型。
(2) PostMessage:该函数将消息发送后就可以直接返回。其函数原型为:
BOOL PostMessage(HWND hWnd, UINT message, WPARAM wParam=0, LPARAM lParam=0);
hWnd:其窗口程序接收消息的窗口的句柄。
message:指定要发送的消息。
wParam:指定额外消息依赖的信息。
lParam:指定额外消息依赖的信息。
注:上面的WPARAM和LPARAM参数表示一个32位的值,将作为参数传递给响应Windows消息的函数。
例如:
PostMessage((HWND)(pQQDlg->GetSafeHwnd()), WM_xxx, 情况1, FALSE);