有什么Win32函数可以用来从CComboBoxEx控件获取计数/项目数据吗



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

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

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

  • m_pComboDates->GetCount()
  • m_pComboDates->GetItemDataPtr(i)

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

  • 我们可以访问父句柄(GetParent()->GetSafeHWnd())
  • 我们知道父对话框(IDC_COMBOBOXEX_OCLM_WEEK_OF_MEETING)上控件的ID

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


我知道有以下宏:

  • ComboBox_GetCount
  • ComboBox_GetItemData

但是:

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

事实上,我想我误解了那些";宏";。我可以得到这样的组合句柄:

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

但是,ComboBox_GetCount不返回值。其他人也一样。所以我有点困惑。


根据答案,该位现在很好:

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>,它也不会起作用。

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

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

一旦你有了组合框的HWND,你就可以向它发送CB_GETCOUNT消息,询问它包含多少项目:

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

当然,如果您的项目数据是指针(例如,如果您有一个所有者绘制的CBS_HASSTRINGS样式为1的组合),则需要相应地修改第二个代码片段,并在必要时添加相关的reinterpret_cast操作。(注意,LRESULTWPARAM类型都被定义为适合于存储指针。)


1链接的M/S文档页面有点模糊,这是否适用于带有或不带有CBS_HASSTRINGS样式的所有者绘制的组合。

最新更新