m_pParentWnd和pWndParent有何区别?
没什么区别,一个是形参,一个是成员变量为什么同样的类型我直接用m_pParentWnd就不行,一定要pWndParent赋给他才行? 
直接用m_pParentWnd,没被赋值,当然不行SetParentWnd函数又是如何获得父指针的?
在创建Dlg1出来的时候,调用dlg1.SetParentWnd(this);

解决方案 »

  1.   

    你说“在创建Dlg1出来的时候,调用dlg1.SetParentWnd(this);”   其中的this是隐参吗 ?关键是这个函数是一个自定义的,完全都是,并不是MFC封装的,所以内部实现也没有,为何就能获得父窗口指针 ?跟CWnd有关吗 ? 
      

  2.   

    CMainDlg是主窗口,CDlg1是通过一个按钮打开的窗口试下这样。。CDlg1 m_Dlg1;void CMainDlg::OnBnClickedBtn1()
    {
        m_Dlg1.Create(IDD_DLG1);
        m_Dlg1.SetParentWnd(this);
        m_Dlg1.ShowWindow(SW_SHOW);
    }
      

  3.   

    SetParentWnd(CWnd* pWndParent) 该函数你在什么地方调用了呢
      

  4.   

    你的意思是说MFC在运行的时候就已经够建好了Dlg1了吗?只是没有显示?你的方法不行,点击后子窗口一晃就没了,瞬间显示瞬间消失!我实在主窗口通过按钮ShowWindow(SW_SHOW)的子窗口,然后再输入值后点击按钮把数值返显到主窗口 在子窗口里自定义了: 
            bool SetParentWnd(CWnd* pWndParent); 
    CWnd* m_pParentWnd; 
    然后在cpp里实现函数: 
            bool CDlg1::SetParentWnd(CWnd* pWndParent) 
            { 
    ASSERT(IsWindow(pWndParent->GetSafeHwnd())); 
    m_pParentWnd = pWndParent; 
    return true; 
            } 
    再通过按钮触发: 
            void CDlg1::OnBnClickedButton1() 
            { 
    // TODO: Add your control notification handler code here 
    UpdateData(true); 
    m_pParentWnd->SendMessage(WM_DEF_OVER,m_Val3,1); 
    m_pParentWnd->SendMessage(WM_DEF_OVER,m_Val4,2); 
    }这些都是在CDlg1里面写的。我就是不明白自定义的bool CDlg1::SetParentWnd(CWnd* pWndParent)函数为什么可以得到CMain的指针你有Q吗 ?加我好吗?53035625 
      

  5.   

    回复zuozhiming :不用收到调用,他是全局定义的,入口点应该在Main之前,我要是知道他在什么时候调用的就不发帖子问了 
      

  6.   

    其实你可以定义全局的CMain指针 CMain* g_pMainDlg;
    在Dlg1.cpp中
    extern CMain* g_pMainDlg;
    发消息时 ::SendMessage(g_pMainDlg->m_hWnd, WM_DEF_OVER, m_Val3,1);即可,试试看消息函数在CMain中写
      

  7.   

    CDlg1 m_Dlg1;
    这个是CMainDlg的成员变量。。声明为局部变量的话肯定会 点击后子窗口一晃就没了,瞬间显示瞬间消失!局部变量的作用域仅限声明该变量的函数内部。。
      

  8.   

    m_Dlg1.SetParentWnd(this); 这儿的this其实就是 CMainDlg*, CMainDlg继承自CWnd
      

  9.   

    回复zuozhiming : 
    你的思路很好,不过你试一下就知道了,两个对话框互传包含头文件是会出错,而且你的那句话“发消息时 ::SendMessage(g_pMainDlg->m_hWnd, WM_DEF_OVER, m_Val3,1);即可”会报错,error C2660: 'CWnd::SendMessageW' : function does not take 4 arguments不让有四个参数
      

  10.   

    互传包含头文件是会出错 用前置声明就可以不让有四个参数 调用API的SendMessage,不要调用CWnd的
      

  11.   

    GetParent()->SendMessage(WM_DEF_OVER, m_Val3,1)