1

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

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

我决定做的(效果很好)是在弹出对话框的构造函数中传递我的组合地址。所以我现在可以执行以下操作:

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

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

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

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


我知道有这些宏:

但:

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

4

1 回答 1

3

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

就在这里。该SendMessage函数(及其返回值)是您所需要的……</p>

获得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

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


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

于 2021-10-02T16:29:16.760 回答