【发布时间】:2022-01-11 08:45:54
【问题描述】:
我最近将一个 Visual Studio 8.0 项目转换为 Visual Studio 2019,但在某些项目上调用 GetDlgItem 时遇到问题。以下代码失败。
PPOtypeComboHndl[0] = GetDlgItem(Hndl, IDC_PPO_TYPE1);
assert(PPOtypeComboHndl[0] != NULL);
LOG_INFO() << "PPOtypeComboHndl Hndl value is " << PPOtypeComboHndl[0];
000000 中记录的值似乎不正确。
我在调用上述代码的表单的资源文件中看到此代码。
COMBOBOX IDC_PPO_TYPE1,140,247,54,13,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
我相信调用GetDlgItem() 控制项处理无效。这在项目的 8.0 版本中不是问题。 IDC_PPO_TYPE1 似乎是此表单上的有效资源。这似乎是将项目从 8.0 转换到 2019 时的问题。
【问题讨论】:
-
没有minimal reproducible example,我们无法评估您的设置有什么问题。我们看不到您的资源是什么样子,或者其中定义了什么。我们看不到您的代码在创建对话框或尝试访问 ComboBox 时的样子。如果我不得不猜测,要么
IDC_PPO_TYPE1定义不正确,要么Hndl没有指向您期望的对话框。 -
我不知道你从哪里调用了哪个函数。 MFC 使用
CWnd* control = GetDlgItem(IDC_PPO_TYPE1);,例如,您可以在CDialog::OnInitDialog之后调用它。然后是 Windows APIHWND hwnd_control = ::GetDlgItem(m_hWnd, IDC_PPO_TYPE1)其中m_hWnd是父窗口的句柄,你必须确保父窗口已创建,句柄可以使用::IsWindow(m_hWnd)进行测试 -
谢谢 - 我确实将事件发送给我的事件处理程序,所以我相信 Hndl 值是正确的。但我无法在控件 UI 项中设置默认值
-
很可能您使用了错误的
Hndl或使用了错误的时间。使用::IsWindow(Hndl)和::GetWindowText(Hndl, title, 100);检查它是正确的对话框。您还可以使用 Visual Studio 工具菜单中的 Spy++ 来检查窗口句柄是否与Hndl -
在
GetDlgItem()呼叫后立即呼叫GetLastError()。GetDlgItem()是系统调用(不是 MFC),不应失败。对话框句柄或控件 ID 错误。在代码中与GetDlgItem()调用相同的位置记录它们,并将记录的值与SpyXX实用程序中显示的值进行比较(选择 Spy->Find Window,将目标拖到对话窗口并检查其属性 - 句柄和子项)。你必须找出他们在哪里得到了错误的值。
标签: c++ visual-studio winapi visual-studio-2015 mfc