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 
  • 相关阅读:
    PAT顶级 1015 Letter-moving Game (35分)
    PAT顶级 1008 Airline Routes (35分)(有向图的强连通分量)
    PAT顶级 1025 Keep at Most 100 Characters (35分)
    PAT顶级 1027 Larry and Inversions (35分)(树状数组)
    PAT 顶级 1026 String of Colorful Beads (35分)(尺取法)
    PAT顶级 1009 Triple Inversions (35分)(树状数组)
    Codeforces 1283F DIY Garland
    Codeforces Round #438 A. Bark to Unlock
    Codeforces Round #437 E. Buy Low Sell High
    Codeforces Round #437 C. Ordering Pizza
  • 原文地址:https://www.cnblogs.com/zhaoxinshanwei/p/3852512.html
Copyright © 2011-2022 走看看