【问题标题】:C++ CDialogEx losses ParentWnd when run from DLL从 DLL 运行时 C++ CDialogEx 丢失 ParentWnd
【发布时间】:2015-09-14 11:24:16
【问题描述】:

我有一个情况。 有一个巨大的应用程序(C++ MFC)。我编写了一个带有可停靠窗格的 .dll 模块。

窗格界面结构:

 Pane -> CMFCToolBar  
      -> CSplitterWndEx -> CListCtrl 
                        -> CDialogEx

这就是我创建 DialogEx 的方式:

int CMyPane::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    ///////////////////////////////////////////
    ////////// TAB CTRL ///////////////////////
    ///////////////////////////////////////////

    const int dwResTabCtrlStyle = WS_CHILD | WS_VISIBLE | TCS_VERTICAL;// | LVS_SINGLESEL;  
    
    if(!m_SptitterWndEx.AddTabCtrl(0, 1, &m_tabCtrl, CMFCTabCtrl::STYLE_3D, CMFCBaseTabCtrl::LOCATION_TOP, CSize(10,10)))
        return -1;

    {
        AFX_MANAGE_STATE(AfxGetStaticModuleState());
        
        m_DialogEx.Create(CAccuracyResultPage::IDD, NULL);
    }

    m_DialogEx.SetParent(&m_tabCtrl);
    if(!m_DialogEx.GetParent())
        return -1;

    str.LoadString( AfxGetStaticModuleState()->m_hCurrentResourceHandle, IDS_RESULT_TAB);
    m_tabCtrl.AddTab(&m_DialogEx, str, 0);  

    AdjustLayout();

    return 0;
}

我在 CDialogEx::PreTranslateMessage 上得到断言。原因是当它得到它的父母时

_AFXWIN_INLINE CWnd* CWnd::GetParent() const
    { ASSERT(::IsWindow(m_hWnd)); return CWnd::FromHandle(::GetParent(m_hWnd)); }

m_hWnd 不是 Wnd。但是 CDialog 看起来完全没问题,它有 m_pParentWnd,但不是 m_tabCtrl。

所以我的问题是:为什么 CDialogEx 不设置它的父级?!又该如何处理?!

【问题讨论】:

  • 您问的是父母(不太可能)还是所有者?那是不同的关系。见Child WindowsOwned Windows
  • 我想“将父窗口的客户区划分为功能区”。事实上,进入一个功能区。作为 TabPage 的对话框。

标签: c++ dll mfc cdialog


【解决方案1】:

您的对话框模板位于何处?它在同一个dll中吗?如果不是,那我认为这是你的问题。

我的猜测是,如果您的对话框模板驻留在不同的 dll 中,则 windows 可能会在该 dll 的模块状态的 HWND=>CWnd 映射中搜索。如果发生这种情况,它将无法在地图中找到 CWnd,并将创建一个临时 CWnd 对象并将其设置为对话框的父对象。

【讨论】:

  • 没有。我的对话框类和对话框模板位于同一个项目中。
猜你喜欢
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多