在CDialog派生类上创建,使用VS2015 CLR返回0,在VC ++ 6中正常工作

时间:2017-01-04 08:28:59

标签: c++ visual-studio-2015 mfc cdialog visual-studio-6

我尝试迁移基于VC ++ 6的代码以使用VS2015 CLR。 我有一些主要的功能,但UI缺少一些东西。

由于父CWnd的NULL HWnd,我已将此问题追溯到SubclassDlgItem的失败。它为NULL,因为CDialog派生父类上的Create在dlgcore.cpp

中返回0
if (hWnd != NULL && !(m_nFlags & WF_CONTINUEMODAL))
    {
        ::DestroyWindow(hWnd);
        hWnd = NULL;
    }

m_nFlags = 256(定义为#define WF_OLECTLCONTAINER 0x0100 //某些后代是afxwin.h中的OLE控件)

并且hWnd不是NULL,但是' :: CreateDialogIndirect()没有创建窗口(即由于模板中的错误)并返回NULL'根据微软的评论

以下是父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
}

我怎样才能让它发挥作用?

1 个答案:

答案 0 :(得分:1)

通过在创建时删除导致问题的ActiveX控件来修复对话框模板,解决了这个问题。我创建了一个重复的对话框并清空它以测试Create是否成功。