【问题标题】:Create on a CDialog derived class returns 0 with VS2015 CLR, worked fine in VC++ 6使用 VS2015 CLR 在 CDialog 派生类上创建返回 0,在 VC++ 6 中运行良好
【发布时间】:2017-01-04 08:28:58
【问题描述】:

我正在尝试迁移基于 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() 没有创建窗口(即由于模板中的错误)并根据 Microsoft cmets 返回 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
}

我怎样才能让它工作?

【问题讨论】:

  • 谢谢,更新了“感觉”的细节。
  • 澄清:MFC 自带源,您可以进入它们并检查在创建过程中到底发生了什么故障。
  • 是的,在 dlgcore.cpp 中调用了 DestroyWindow,因为 m_nFlags = 256。
  • 您是否检查了父窗口的创建?您没有将类名传递给 CreateEx,因此可能会失败。使用 MFC 时,即使您不想在发布期间检查错误,请在调试时检查它们(例如,使用 VERIFY 宏:VERIFY(CreateEx(...))。
  • 我之前手动检查过,通过并且有一个有效的HWnd。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多