加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

c++ 对话框之间传递信息(自定义消息sendmessage)

(2017-04-26 10:23:26)
标签:

mfc

c

分类: 编程

建了一个基于对话框的MFC程序,在主对话框中添加tabcontrol控件,又新建了两个Dialog(CDialog1和CDialog2),将它们设为tabcontrol控件的子对话框。

目的:两个子对话框之间传递消息,子对话框与主对话框传递消息。

第一步: 定义消息.

             在目标窗口类的头文件或者stdafx.h中添加: #define WM_MY_MESSAGE  (WM_USER+100);     推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。

       第二步:  在目标类头文件的AFX_MSG块中说明消息处理函数: afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);

[cpp] view plain copy
  1. class CDialog1:public CDialog  
  2.   
  3. ...   
  4. // 一般消息映射函数   
  5. protected  
  6. // {{AFX_MSG(CDialog)   
  7.  virtual BOOL OnInitDialog();  
  8.  afx_msg void OnSysCommand(UINT nID, LPARAM lParam);  
  9.  afx_msg void OnPaint();  
  10.  afx_msg HCURSOR OnQueryDragIcon();  
  11. afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);   
  12. //}}AFX_MSG   
  13. DECLARE_MESSAGE_MAP()   
  14.   

   

         第三步:在目标类源文件cpp中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。

 

[cpp] view plain copy
  1. BEGIN_MESSAGE_MAP(CDialog1, CDialog)   
  2.  ON_WM_SYSCOMMAND()  
  3.  ON_WM_PAINT()  
  4.  ON_WM_QUERYDRAGICON()  
  5. ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)   
  6. //}}AFX_MSG_MAP   
  7. END_MESSAGE_MAP()   

             第四步:  实现消息处理函数。

              在目标类源文件cpp中,该函数使用WPRAM和LPARAM参数并返回LPESULT。 

[cpp] view plain copy
  1. LPESULT CDialog1::OnMyMessage(WPARAM wParam, LPARAM lParam)   
  2.   
  3. // TODO: 处理用户自定义消息   
  4. //MessageBox("消息传递完成!");  
  5. return 0;   
  6.   


              第五步:发送消息时,在源地址类CDialog2的CPP文件中(如一个Button),调用函数PostMessage或SendMessa
ge发送消息。PoseMessage(WM_MY_MESSAGE,O,O); SendMessage(WM_MY_MESSAGE,O,O);

            

              假如主对话框的类名:CSecondShimDlg,两个子对话框的类名CDialog1和CDialog2;

            要实现两个子对话框之间进行通信(CDialog2向CDialog1发送消息,目标类即为CDialog1),则在CDialog2源文件中的发送函数应该这么写:

[cpp] view plain copy
  1. CSecondShimDlg m_Host (CSecondShimDlg*)AfxGetMainWnd();   
  2. m_Host->m_Diag1.SendMessage(WM_MY_MESSAGE wparam, lparam);//这里要注意是m_Diag1,它是在主对话框类中定义的一个CDialog1对象,即目标对象。  


              要实现CDialog2向主对话框CSecondShimDlg发送消息(目标类即为CSecondShimDlg),则:

[cpp] view plain copy
  1. CSecondShimDlg m_Host (CSecondShimDlg*)AfxGetMainWnd();   
  2. m_Host->SendMessage(WM_MY_MESSAGE wparam, lparam);  

               或者:             

[cpp] view plain copy
  1. ::SendMessage(this->GetParent()->GetParent()->m_hWnd, WM_MY_MESSAGE ,wparam, lparam);  
  2.     // SendMessage函数的第一个参数是目标窗口的句柄。之所以要用两个GetParent()因为Dialog2的父对话框为TabControl,TabControl的父对话框为主对话框CSecondShimDlg   


 

这样即可完成对话框之间的消息传递。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有