zoukankan      html  css  js  c++  java
  • vc++ 不同对话框中传递信息的方法(基于自定义消息SendMessage) (转载)

    转载自:http://blog.csdn.net/myj0513/article/details/6827360

    背景: 新建了一个基于对话框的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);

    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宏指令将消息映射到消息处理函数中。

    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。

    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源文件中的发送函数应该这么写:

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


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

    1. CSecondShimDlg * m_Host = (CSecondShimDlg*)AfxGetMainWnd();   
    2. m_Host->SendMessage(WM_MY_MESSAGE , wparam, lparam);  

                   或者:             

      1. ::SendMessage(this->GetParent()->GetParent()->m_hWnd, WM_MY_MESSAGE ,wparam, lparam);  
      2.     // SendMessage函数的第一个参数是目标窗口的句柄。之所以要用两个GetParent()因为Dialog2的父对话框为TabControl,TabControl的父对话框为主对话框CSecondShimDlg 
  • 相关阅读:
    生成全局id的方式
    如何使得搜索的信息更准确?
    水平分区
    大表如何优化?
    MySQL_fetch_array和MySQL_fetch_object的区别是什么?
    BLOB和TEXT区别
    如何在Unix和MySQL时间戳之间进行转换?
    用ActionSupport实现验证
    服务器端验证--验证框架验证required.
    自定义类型转换器converter
  • 原文地址:https://www.cnblogs.com/zhaoxinshanwei/p/3852512.html
Copyright © 2011-2022 走看看