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