我正在处理的对话框未显示,使用:
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 失败的更隐晦的方式之一是对话框上的子控件创建失败。通常是因为应用程序在尝试创建对话框之前尚未初始化公共控件库。看初始化通用控件Ex http://msdn.microsoft.com/en-us/library/bb775697(VS.85).aspx
检查这一点的一种方法是在资源编辑器中打开对话框,转到对话框的属性,然后找到并打开DS_NOFAILCREATE
旗帜。通常被称为“No Fail Create”之类晦涩难懂的东西。或者添加DS_NOFAILCREATE
直接到内存中的对话框模板。这将使对话框显示出来,而罪魁祸首应该通过它的缺席而显而易见。
如果子控件是实际的自定义控件 - 那么自定义窗口类要么未正确注册,要么根本没有注册。检查注册中使用的 HINSTANCE - 除非指定了 CS_GLOBAL 标志,否则窗口类由 (hInstance, ClassName) 标识 - 这可以防止在不同 dll 中使用相同名称的窗口类发生冲突。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)