我的父對話框有一個CComboBoxEx控制元件(映射到一個名為 的派生類CDatesComboBoxEx)。
在應用程式的一部分中,此對話框顯示一個彈出式模式對話框。而且,在模態對話框中,它需要訪問日期組合中的資訊。
我決定做的(作業正常)是在彈出對話框的建構式中傳遞我的組合地址。所以我現在可以做這樣的事情:
m_pComboDates->GetCount()m_pComboDates->GetItemDataPtr(i)
我想知道是否有任何方法可以在這里使用本機 Win32 代碼?
- 我們可以訪問父句柄 (
GetParent()->GetSafeHWnd())。 - 我們知道父對話框上控制元件的 ID (
IDC_COMBOBOXEX_OCLM_WEEK_OF_MEETING)。
那么是否有可能以某種方式直接獲取計數和專案資料?
我知道有這些宏:
ComboBox_GetCountComboBox_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>它也不會奏效。
uj5u.com熱心網友回復:
我想知道是否有任何方法可以在這里使用本機 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
當然,如果您的專案資料指標(比如,如果你有一個所有者繪制組合1的CBS_HASSTRINGS樣式),您將需要修改第二代碼片段因而,在添加相關的reinterpret_cast操作,其中必要的。(請注意,LRESULT和WPARAM型別都被定義為適合存盤指標。)
1鏈接的M / S檔案頁面上這是否適用于自行繪制連擊有點模糊有或無的CBS_HASSTRINGS風格。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/314738.html
