0

状況があります。巨大なアプリ (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 がその親を設定しないのはなぜですか?! そして、それはどのように対処できますか?

4

1 に答える 1

0

ダイアログ テンプレートはどこにありますか? それは同じdllにありますか?そうでない場合は、それがあなたの問題だと思います。

私の推測では、ダイアログ テンプレートが別の dll に存在する場合、Windows はその dll のモジュール状態の HWND=>CWnd マップを検索する可能性があります。その場合、マップ内で CWnd を見つけることができず、一時的な CWnd オブジェクトが作成され、ダイアログの親として設定されます。

于 2015-09-21T09:41:27.803 に答える