初学自定义消息(举例)

来源:互联网 发布:滴滴出行大数据平台 编辑:程序博客网 时间:2024/06/07 06:48


用户自定义消息值:

#define WM_USER  0x0400

windows消息值范围:

消息值范围意义0x0000-0x03FFWindows消息0x0400-0x07FF
用户自定义0x0800-0x0BFF
保留0x0C00-0x0FFF
供应用使用的
字符串消息

以下部分内容参考文章来源:http://blog.csdn.net/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_msgLRESULT 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后开始响应消息。

 

 

 

 

 

原创粉丝点击