C ++ CDialogEx теряет ParentWnd при запуске из DLL

У меня есть ситуация.
Существует огромное приложение (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 не устанавливает своего родителя ?! И как с этим можно бороться ?!

0

Решение

Где находится ваш шаблон диалога? Это в той же DLL? Если нет, то я думаю, что это ваша проблема.

Я предполагаю, что если ваш шаблон диалога находится в другой библиотеке DLL, то окна могут искать в карте HWND => CWnd состояния модуля этой библиотеки DLL. Если это произойдет, он не сможет найти CWnd на карте и создаст временный объект CWnd и установит его в качестве родителя диалога.

0

Другие решения


По вопросам рекламы [email protected]