class CMyDialog
{
public:
CTabCtrl m_TabSheet;
CDialog m_Dialog1;
CDialog m_Dialog2;
CDialog m_Dialog3;
};
我把m_Dialog1,m_Dialog2,m_Dialog3放在m_TabSheet上做他的标签页,然后把m_TabSheet贴在CMyDialog对话框上
现在我想在m_Dialog1上点击鼠标右键,然后在CMyDialog里响应。解决方法以及问题:
1.在m_Dialog1通过GetParent()获得父对话框的指针,但是这里获得的是m_TabSheet的指针而不是CMyDialog的指针,而在m_TabSheet里GetParent()获得的才是CMyDialog的指针。所以这种方法要通过m_TabSheet传递一次CMyDialog的指针。 不怎么好吧?
(我在m_Dialog1里直接用m_pParentWnd,m_pParentWnd为空,为什么?一定要通过GetParent()才能获得?)2.m_Dialog1重载SetParent(),在CMyDialog里m_Dialog1.SetParent(this)改变m_Dialog1的父指针(m_Dialog1本来的父指针是m_TabSheet)。  这样会出问题吗?3、我们在一般的对话框里添加控件的时候,消息响应是怎么联系起来的?是DDX_Control(pDX, IDC_BUTTON1, m_Btn)这个宏联系起来的吗?我这样在CMyDialog里DDX_Control(pDX, IDC_DIALOG1, m_Dialog1)好像联系不起来。有其他解决方法吗?

解决方案 »

  1.   

    分两种情况:
    1。m_Dialog1,m_Dialog2,m_Dialog3为模式对话框时,在主对话框中调用它们的DoModal成员函数,那DoModal就会加载对话框资料并显示和处理它们的交互
    2。m_Dialog1,m_Dialog2,m_Dialog3为无模式对话框时,在主对话框中调用它们的create成员函数(当然先要重写它们的公共构造函数),然后用ShowWindow显示它们
    手都打软了,额~~~~~~~~~~~~~~~~~~~
      

  2.   

    通常情况下,属于哪个窗口的消息,就在哪个窗口中响应,必要时可以调用其它类的函数。创建子对话框时指定其父窗口,子对话框中用GetParent获得父窗口指针。Tab页通常指定Tab控件为其父控件,可以调用两次GetParent来获得主对话框指针。
    如果要在主对话框中响应子对话框的鼠标消息,也可以重载主对话框类的PreTranslateMessage函数来判断。
      

  3.   

    在不同的TAB中把要显示的显示出来,不显示的隐藏起来就是了
      

  4.   

    3、我们在一般的对话框里添加控件的时候,消息响应是怎么联系起来的?是DDX_Control(pDX, IDC_BUTTON1, m_Btn)这个宏联系起来的吗?我这样在CMyDialog里DDX_Control(pDX, IDC_DIALOG1, m_Dialog1)好像联系不起来。第三个问题有人回答吗?
      

  5.   


    这个怎么做?
    我现在的情况是在tab页上加了子对话框,我右键的消息只能被子对话框接收,而主对话框根本接收不到~
      

  6.   

    Dialog1.Create(nID, &m_TabSheet);
    CRect rect;
    m_TabSheet.GetClientRect(&rect);
    根据需要更正rect,其他的类似
    然后用MoveWindow将子对话框移到合适位置
    Dialog1.MoveWindow(&rect);
    在TabCtrl里添加消息响应函数 SelChange来分别设置显示和隐藏
    至于3,试下将CMyDialog的句柄传给Dialog1,然后在需要响应时发个自定义消息。。
      

  7.   

    建议楼主换一下思路,按以下方式进行声明和创建对应的类,建议到下边的网页 看看方案5
    http://www.vckbase.com/document/viewdoc/?id=398

    class CMyDialog
    {
    public:
        CTabCtrl m_TabSheet;};
    class CMyTabCtrl : public CTabCtrl
    {
    // Construction
    public:
    CMyTabCtrl();
    CDialog* m_tabPages[3];//3 个属性页对话框
    }
    CMyTabCtrl::CMyTabCtrl()
    {
    ……
    m_tabPages[0] = new Dialog1;
    m_tabPages[1] = new Dialog2; 
    m_tabPages[2] = new Dialog3;……
    }
    1.把主对话框头文件包含入子对话框所在的cpp文件,在子对话框的头文件内声明一下class CMyDialog
    CMyDialog* dlg = (CMyDialog*)AfxGetApp()->GetMainWnd(); 
            即可获取对应的主对话框指针。2.此冲突问题是有可能的,试试就知道,所以建议楼主换一下创建类的思路。3.此调用方式一般针对于对话框容器内的控件对象
    DDX_Control(pDX, IDC_DIALOG1, m_Dialog1)对话框资源按如下方式绑定当然不合适,一般是在对应的对话框头文件里, enum { IDD = IDD_DIALOG1};进行绑定