Я пытаюсь перенести код на основе VC ++ 6 для работы с VS2015 CLR.
У меня работает основная функциональность, но в пользовательском интерфейсе чего-то не хватает.
Я проследил эту проблему до сбоев SubclassDlgItem из-за NULL HWnd для родительского CWnd. Это NULL, потому что Create в производном родительском классе CDialog возвращает 0 при следующем в dlgcore.cpp
if (hWnd != NULL && !(m_nFlags & WF_CONTINUEMODAL))
{
::DestroyWindow(hWnd);
hWnd = NULL;
}
m_nFlags = 256 (определяется как #define WF_OLECTLCONTAINER 0x0100 // некоторый потомок является элементом управления OLE в afxwin.h)
И hWnd не NULL, но ‘:: CreateDialogIndirect () НЕ создал окно (т.е. из-за ошибки в шаблоне) и возвращает NULL’ согласно комментариям Microsoft
Ниже приведен код для родительского CWnd
CreateEx(
WS_EX_NOPARENTNOTIFY,
NULL,
"MainClient",
WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
0, 0, // Locate at upper left corner of client area
1, 1, // Initial size doesn't matter - will be sized to fit parent
parent->GetSafeHwnd(),
NULL
);
Ниже приведен код для создания CDialog
m_pMainDialog = new CxMainDialog();
m_pMainDialog->Create(IDD_MAIN_DIALOG, this);
Ниже представлен конструктор CxMainDialog
CxMainDialog::CxMainDialog(CWnd* pParent /*=NULL*/)
: CDialog(CxMainDialog::IDD, pParent)
{
//{{AFX_DATA_INIT(CxMainDialog)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
Как я могу заставить это работать?
Это было решено путем исправления шаблона диалога путем удаления элементов управления ActiveX, вызывающих проблему при создании. Я создал дубликат диалогового окна и опустошил его, чтобы проверить успешность создания.
Других решений пока нет …