初始化对话框后,子对话框的 hWnd 将重置为 NULL。

Subdialog's hWnd resets to NULL after the dialog is initialized

本文关键字:对话框 NULL hWnd 初始化      更新时间:2023-10-16

我遇到了以下问题。我有一个有一些控件的主对话框。它还显示了几个子对话框(作为子控件),这些子对话框被设置为具有其ID的指针成员。我在OnInitDialog期间通过CreateControl与他们的ID创建这些对话。昨天它工作得很好。今天,我决定在子对话框中添加一些控件,发现了一个问题。

这就是我在OnInitDialog期间在主对话框中创建子对话框的方法:

if (m_pNewObjDlg != NULL) m_pNewObjDlg->Create(m_nNewObjDlgID, this);
if (m_pSharedObjDlg != NULL) m_pSharedObjDlg->Create(m_nSharedObjDlgID, this);

这就是我如何在我的一个例程之外设置子对话框:

dlgSelectSharedObject.SetNewPageObject(&dlgSelectNewTableDialog, CSelectNewTableDialog::IDD);
dlgSelectSharedObject.SetSharedPageObject(&dlgSelectSharedTable, CSelectSharedTableDialog::IDD);

我看到两个子对话框的OnInitDialogDoDataExchange工作良好,子对话框的m_hWnd设置,GetDlgItem方法返回有效值。但是当执行回到主对话框的OnInitDialog时,我看到pNewObjDlgpSharedObjDlgm_hWnd值是NULL。我不知道这是怎么发生的。我仔细检查了ID,它们没有重叠。结果,我得到一个ASSERT,除了与其控件的主对话框外,没有显示任何内容。有什么想法吗?

问题解决了。当数据加载到DoDataExchange中的控件时,我偶尔调用Fail。它是一个没有项目的组合框,因为DoDataExchange是在组合框初始化之前从基类调用的。这不是逻辑所期望的,因此调用了Fail。它会导致这些子窗口被破坏。