用户自定义消息值:
#define WM_USER 0x0400
windows消息值范围:
消息值范围 | 意义 |
0x0000-0x03FF | Windows消息 |
0x0400-0x07FF | 用户自定义 |
0x0800-0x0BFF | 保留 |
0x0C00-0x0FFF | 供应用使用的 字符串消息 |
以下部分内容参考文章来源:http://blog.youkuaiyun.com/gukesdo/article/details/6751052
1.在对应类的头文件中自定义消息
如:#define MYMESSAGE WM_USER+1
2.在头文件中定义消息响应函数
注意:这个函数的返回值必须是LRESULT 参数必须是 WPARAM 和LPARAM类型。
这是因为afx_msg void OnMyMessage( WPARAM , LPARAM ); 这样定义的方法在VC6中是可以的,但是在VS2005等以后要求严格了,要定义成这样,如:afx_msg LRESULT DisplayResult(WPARAM wParam,LPARAM lParam);
1、新建MultiThread000基于对话框的应用程序,在对话框里添加二个静态文本框,IDC_TIME,IDC_STATE;按钮IDC_START
2、在MultiThread000Dlg.h里
添加自定义消息:#define WM_TIME WM_USER+1
添加消息响应函数声明:afx_msg LRESULT ShowTime(WPARAM wParam,LPARAM lParam); // 自定义消息响应函数原型
3、在MultiThread000Dlg.cpp
添加消息映射:ON_MESSAGE(WM_SHOWTIME,ShowTime)
添加两个函数定义,
void CMultiThread000Dlg::OnStart()
{
this->PostMessage(WM_SHOWTIME,0,0L);
CString str="调到后方";
::SetDlgItemText(AfxGetApp()->m_pMainWnd->m_hWnd,IDC_STATE,str);
//Sleep(3000);
}
LRESULT CMultiThread000Dlg::ShowTime(WPARAM wParam,LPARAM lParam)
{
CTime ctime;
CString str;
for(int i=0;i<20;i++)
{
ctime=CTime::GetCurrentTime();
str=ctime.Format("%H:%M:%S");
Sleep(1000); //每个1秒显示一个数字
::SetDlgItemText(AfxGetApp()->m_pMainWnd->GetSafeHwnd(),IDC_TIME,str);
}
::SetDlgItemText(AfxGetApp()->m_pMainWnd->GetSafeHwnd(),IDC_TIME,"loop over"); // 显示完成
//Sleep(3000);
return 0l;
}
单击“开始”后,程序运行过程如图:PostMessage把消息放到队列后,马上执行OnStart函数里后面的句子,执行完后(一定要等执行完本函数后)再切换到消息函数里,因为在这个是单线程,CPU一个时刻只能在干一个任务,干完后才能接着别的任务。
可以再OnStart函数里最后面加Sleep(5000),5s 的等待,结果是在OnStart函数等待5s期间,消息都不会响应,5s后开始响应消息。