【问题标题】:GetDlgItem() returns null in vc++ 2010GetDlgItem() 在 vc++ 2010 中返回 null
【发布时间】:2011-04-15 07:00:32
【问题描述】:

我最近将一个 Visual Studio 6.0 项目转换为 Visual Studio 2010,但在对某些项目调用 GetDlgItem 时遇到问题。以下代码失败。

CWnd *pWnd = (CWnd*) GetDlgItem(IDC_BATCH);
pWnd->GetWindowText(szBatchNum);

我在调用上述代码的表单的资源文件中看到此代码。

IDD_CC_PROCESS DIALOGEX 0, 0, 657, 410
STYLE DS_SETFONT | WS_CHILD
FONT 8, "MS Sans Serif", 0, 0, 0x0
BEGIN
CONTROL         "",IDC_BATCH,"{978C9E23-D4B0-11CE-BF2D-00AA003F40D0}",0x0,85,18,89,16
END

调用 GetDlgItem() 后 pWnd 为 NULL。这在项目的 6.0 版本中不是问题。 IDC_BATCH 似乎是此表单上的有效资源。 IDC_BATCH 指向“Microsoft Forms 2.0 标签”。这似乎是我在将项目从 6.0 转换到 2010 时遇到的众多问题之一。

【问题讨论】:

  • 检查您的资源文件。如果它返回 NULL 则没有具有该 ID 的子 dlg 项...
  • 我在上面的帖子中添加了我在资源文件中看到的内容。
  • 如果你在 GetDlgItem 调用处设置断点并使用 Spy++ 搜索窗口,你找到了吗?我猜你不会。
  • 我打开 Spy++ 并右键单击每个“窗口”并点击突出显示,但似乎没有任何“Microsoft Forms 2.0 标签”控件存在。
  • 巧合的是,我打开了 Visual Studio 6.0 项目,并且能够在 spy++ 中找到窗体上所有“Microsoft Forms 2.0 标签”控件的窗口。

标签: c++ visual-studio-2010 mfc


【解决方案1】:

我对这个问题没有任何特别的了解,但我会检查是否已针对 VS2010 附带的 MFC 版本更新了 GUID/控件。如果 MFC 版本无法通过 GUID 识别控件类型,则可能无法为其正确创建 CWnd 包装对象。您可能需要更新 VS2010 的 GUID,和/或尝试使用本机 Win32 调用来访问它,而不是 MFC 包装器调用。

希望对您有所帮助。

【讨论】:

  • 我不太确定如何做这两个。您有什么可以帮助我入门的信息吗?
  • 在 MSDN 中搜索 Win32 等效函数以了解您正在尝试执行的操作,或者查看 MFC 源代码并对其进行仿真。这可能是最简单的处理方法,除非您需要对 MFC 包装器中实现的控件执行一些重要的操作。
【解决方案2】:

尝试枚举 GetDlgItem 调用来自的 CWnd 的子项,并查看句柄是否有子项。您还应该检查GetLastError 返回的值,这应该表明它是否是实际错误,以及该错误是什么,或者控件是否真的没有子项(这可能是 res 文件中的错误),或者如果父控件甚至存在

【讨论】:

  • 我遍历了所有子项,它基本上与我在 Spy++ 中看到的一致。除了 2 个“Microsoft Forms 2.0 Label”控件外,表单上的所有控件都在那里。 GetLastError() 也没有返回任何错误。
  • 我能想到的唯一另一件事是控件 id 不匹配,您的代码是从一个标头中提取的,而 res 文件是从具有不同 id 的其他东西中提取的
猜你喜欢
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 2011-09-22
  • 2011-05-28
  • 2011-12-30
  • 2016-11-07
相关资源
最近更新 更多