gpt4 book ai didi

c++ - CWnd::CreateDlgIndirect 离开 m_hWnd==NULL

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:21:25 25 4
gpt4 key购买 nike

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

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

对 CreateDlgIndirect 的调用是在 lon-used 基类中进行的,它有效地获取了资源文件中对话框模板的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com