我正在使用的对话框未显示,使用:

CWnd::CreateDlgIndirect(LPCDLGTEMPLATE lpDialogTemplate,CWnd* pParentWnd, HINSTANCE hInst)

对CreateDlgIndirect的调用是在一个长期使用的基类中,该基类有效地获取了资源文件中对话框模板的IDD-在许多其他对话框中都可以正常使用,但是我看不到对话框有什么不同。当以更常规的方式创建对话框时,我的对话框可以正常工作,但是我必须使用基类,因为它内置了许多其他功能。

在dlgcore.cpp中通过CWnd::CreateDlgIndirect进行拖网时,我发现纯Win32 API调用失败:
hWnd = ::CreateDialogIndirect(hInst, lpDialogTemplate,pParentWnd->GetSafeHwnd(), AfxDlgProc);

由于某种原因,我无法进入该功能,因此我所看到的是HWND为NULL。

谁能暗示可能是哪种问题引起的?我比较了两个对话框资源模板,它们的属性是相同的。

编辑:我在对话框上有一个自定义控件。当我删除它时,它可以工作。不知道为什么,这会有什么不同?

最佳答案

CreateDialogXXX失败的一种比较晦涩的方式是让对话框上的子控件无法创建。通常是因为应用程序在尝试进行对话框创建之前尚未初始化公共(public)控件库。参见InitCommonControlsEx

一种检查方法是在资源编辑器中打开对话框,转到对话框的属性,然后找到并打开DS_NOFAILCREATE标志。通常称为模糊的名称,例如“No Fail Create”。或将DS_NOFAILCREATE直接添加到内存中的对话框模板中。这将允许对话框显示,而罪魁祸首应该通过其消失而明显。

在子控件是实际的自定义控件的情况下-自定义窗口类要么未正确注册,要么根本未注册。检查注册中使用的HINSTANCE-除非指定了CS_GLOBAL标志,否则窗口类由(hInstance,ClassName)标识-这样可以防止在不同dll中使用相同名称的窗口类发生冲突。

关于c++ - CWnd::CreateDlgIndirect离开m_hWnd == NULL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1666927/

10-11 21:35