我的父对话框有一个CComboBoxEx
控件(映射到一个名为CDatesComboBoxEx
的派生类)。
在应用程序的一部分中,此对话框显示一个弹出模式对话框。而且,在模态对话框中,它需要访问日期组合框中的信息。
我决定做的(这很好)是在弹出对话框的构造函数中传递我的组合地址。所以我现在可以做一些事情,比如:
m_pComboDates->GetCount()
m_pComboDates->GetItemDataPtr(i)
我想知道是否有任何方法可以在这里使用本机Win32代码?
- 我们可以访问父句柄(
GetParent()->GetSafeHWnd()
) - 我们知道父对话框(
IDC_COMBOBOXEX_OCLM_WEEK_OF_MEETING
)上控件的ID
那么,是否可以以某种方式直接获取计数和项目数据?
我知道有以下宏:
ComboBox_GetCount
ComboBox_GetItemData
但是:
- 这些宏可以与
CComboBoxEx
控件一起使用吗?而且 - 在我之前描述的上下文中,我们如何在组合中获得
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
操作。(注意,LRESULT
和WPARAM
类型都被定义为适合于存储指针。)
1链接的M/S文档页面有点模糊,这是否适用于带有或不带有CBS_HASSTRINGS
样式的所有者绘制的组合。