是否有任何 Win32 函数可用于从 CComboBoxEx 控件获取计数/项目数据?

Are there any Win32 functions I can use to get the count / itemdata from a CComboBoxEx control?

我的父对话框有一个 CComboBoxEx 控件(映射到派生的 class,称为 CDatesComboBoxEx)。

在应用程序的一部分中,此对话框显示弹出模式对话框。而且,在模态对话框中,它需要访问日期组合中的信息。

我决定做的(效果很好)是在弹出对话框的构造函数中传递我的组合地址。所以我现在可以做这样的事情:

我想知道这里是否有任何方法可以使用本机 Win32 代码?

那么是否可以通过某种方式直接获取计数和项目数据?


我知道有这些宏:

但是:

  1. 这些宏可以与 CComboBoxEx 控件一起使用吗?还有...
  2. 根据我之前描述的上下文,我们如何在组合上获得 HWND

实际上,我想我误解了那些“宏”的用途。我可以获得这样的组合句柄:

HWND hDatesCombo = ::GetDlgItem(
    GetParent()->GetSafeHwnd(), IDC_COMBOBOXEX_OCLM_WEEK_OF_MEETING);

但是,ComboBox_GetCount 不是 return 值。其他人也没有。所以我有点困惑。


根据回答,这部分现在没问题了:

HWND hDatesCombo = ::GetDlgItem(GetParent()->GetSafeHwnd(), IDC_COMBOBOXEX_OCLM_WEEK_OF_MEETING);
int iNumDates = static_cast<int>(::SendMessage(hDatesCombo, CB_GETCOUNT, 0, 0));

在我的 for 循环中,我正在这样做:

LRESULT itemData = ::SendMessage(hDatesCombo, CB_GETITEMDATA, static_cast<WPARAM>(i), 0);
auto* pEntry = static_cast<CChristianLifeMinistryEntry*>((LPVOID)itemData);

这是我能找到的唯一施法方式。如果我尝试 static_cast<LPVOID> 它也不会起作用。

I was wondering if there was any way to use native Win32 code here instead?

是的,有。 SendMessage 函数(及其返回值)正是您所需要的……

获得组合框的 HWND 后,您可以向其发送 CB_GETCOUNT message 以询问它包含多少项目:

HWND hDatesCombo = ::GetDlgItem(GetParent()->GetSafeHwnd(), IDC_COMBOBOXEX_OCLM_WEEK_OF_MEETING);
LRESULT nItems = ::SendMessage(hDatesCombo, CB_GETCOUNT, 0, 0);

并且,要获取与特定条目关联的项目数据,请发送 CB_GETITEMDATA 消息,并将相关项目的(从零开始)索引作为 wParam 参数:

//...
LRESULT *ItemData = new LRESULT[static_cast<size_t>(nItems)];
for (int i = 0; i < nItems; ++i) {
    ItemData[i] = ::SendMessage(hDatesCombo, CB_GETITEMDATA, static_cast<WPARAM>(i), 0);
}
//...
delete[] ItemData; // When you're done with the data list

当然,如果您的物品数据是指针(例如,如果您有一个拥有 1 CBS_HASSTRINGS 风格的自绘组合),您将需要相应地修改第二个代码片段,在必要时添加相关的 reinterpret_cast 操作。 (注意 LRESULTWPARAM 类型都被定义为适合存储指针。)


1 链接的 M/S 文档页面对于这是否适用于自绘组合 with没有 CBS_HASSTRINGS 风格。