我正在处理的对话框没有显示,使用:
CWnd::CreateDlgIndirect(LPCDLGTEMPLATE lpDialogTemplate,CWnd* pParentWnd, HINSTANCE hInst)
Run Code Online (Sandbox Code Playgroud)
对CreateDlgIndirect的调用是在一个lon使用的基类中,它有效地获取了资源文件中对话框模板的IDD - 它适用于许多其他对话框但我无法在对话框中看到有什么不同.当以更正常的方式创建时,我的对话框工作正常,但我必须使用基类,因为它具有内置的其他功能.
我在dlgcore.cpp中浏览CWnd :: CreateDlgIndirect时发现的是普通的Win32 API调用失败:
hWnd = ::CreateDialogIndirect(hInst, lpDialogTemplate,pParentWnd->GetSafeHwnd(), AfxDlgProc);
Run Code Online (Sandbox Code Playgroud)
我出于某种原因无法进入该功能,所以我看到的是HWND为NULL.
任何人都可以建议可能导致这种问题的原因是什么?我比较了两个对话框资源模板,它们的属性是相同的.
编辑:我在对话框上有一个自定义控件.当我删除它,它的工作原理.不知道为什么,这会有什么不同?
CreateDialogXXX失败的一种比较模糊的方法是对对象的子控件创建失败.通常是因为在尝试实现对话框创建之前,应用程序尚未初始化公共控件库.请参见InitCommonControlsEx
检查此方法的一种方法是在资源编辑器中打开对话框,转到对话框的属性,然后查找并打开该DS_NOFAILCREATE标志.通常被称为"No Fail Create"之类的东西.或者DS_NOFAILCREATE直接将其添加到内存中的对话框模板中.这将允许对话框显示,并且罪魁祸首应该因缺席而显而易见.
在子控件是实际自定义控件的情况下 - 自定义窗口类未正确注册,或者根本没有注册.检查注册中使用的HINSTANCE - 除非指定了CS_GLOBAL标志,否则窗口类由(hInstance,ClassName)标识 - 这可以防止在不同dll中使用相同名称的窗口类冲突.