如何使用Win32 API获取CComboBoxEx控件的项目数量与ItemData数据
问题核心解答
1. ComboBox_GetCount等宏是否可以作用于CComboBoxEx控件?
CComboBoxEx是MFC对通用控件ComboBoxEx的封装,其底层窗口本身兼容普通ComboBox的所有标准CB_*消息。你遇到的宏调用无返回值的问题,是因为windowsx.h头文件中的ComboBox_GetCount这类宏,在部分版本中会做窗口类校验,仅识别标准ComboBox类名的窗口,而ComboBoxEx的窗口类名为ComboBoxEx32,宏校验不通过就会返回无效值。直接发送CB_GETCOUNT、CB_GETITEMDATA消息是兼容性最好的实现方式,和MFC封装的GetCount()、GetItemDataPtr()内部逻辑完全一致。
2. 如何获取CComboBoxEx控件的HWND句柄?
你现有实现是正确的,通过父窗口句柄+控件ID调用Win32 API::GetDlgItem即可拿到对应控件的窗口句柄:
HWND hDatesCombo = ::GetDlgItem( GetParent()->GetSafeHwnd(), IDC_COMBOBOXEX_OCLM_WEEK_OF_MEETING );
只要父窗口句柄有效、控件ID正确,拿到的hDatesCombo就是合法的ComboBoxEx控件句柄。
可用的完整实现代码
获取项目总数
HWND hDatesCombo = ::GetDlgItem(GetParent()->GetSafeHwnd(), IDC_COMBOBOXEX_OCLM_WEEK_OF_MEETING); int iNumDates = static_cast<int>(::SendMessage(hDatesCombo, CB_GETCOUNT, 0, 0));
遍历获取Item绑定的指针数据
for (int i = 0; i < iNumDates; i++) { LRESULT itemData = ::SendMessage(hDatesCombo, CB_GETITEMDATA, static_cast<WPARAM>(i), 0); auto* pEntry = static_cast<CChristianLifeMinistryEntry*>((LPVOID)itemData); // 后续使用pEntry的逻辑 }
你采用的类型转换方式符合规则:LRESULT是和指针长度匹配的整数类型,必须先强制转换为LPVOID(无类型指针),再转换为目标类指针,直接对LRESULT做static_cast<LPVOID>在部分编译规则下会报错,当前写法是正确的。
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

