2013-03-12 149 views
1

如何獲取動態創建的CComboBoxes中的CBN_SELCHANGE ..我使用了一個CComboBoxes數組。CBN_SELCHANGE動態創建組合框

MyCComboBox * p_ComboBoxes = new MyCComboBox[numberOcComboBoxes]; //numberOcComboBoxes determined at rumtime 

消息映射MyCComboBox的

BEGIN_MESSAGE_MAP(MyCComboBox , CComboBox) 
    ON_CONTROL_REFLECT(CBN_SELCHANGE, &CTestDlg::OnCbnSelchange) 
END_MESSAGE_MAP() 

void CTestDlg::OnCbnSelchange() 
{ 
this->GetDlgCtrlID(); // Get The ComboBox ID; 
CString sText; 
p_ComboBoxes[0].GetLBText(p_ComboBoxes[0].GetCurSel() , sText); // I can't access like this 


} 

//初始化的p_ComboBoxes陣..

for (int i = 0 ;i < iNumber ; i++) 
{ 


p_ComboBoxes[i].Create(WS_CHILD|WS_VISIBLE|WS_VSCROLL|CBS_DROPDOWN, 
     CRect(10 + MY_PIC_ADDITIONAL_WIDTH,iItemDrawHeight,10 + MY_PIC_ADDITIONAL_WIDTH +MY_PIC_PROPERTY_WIDTH 
     ,iItemDrawHeight +MY_PIC_HEIGHT), this, pImageControlPropertyID[i]); 

iItemDrawHeight += MY_PIC_PROPERTY_ADDITIONAL_HEIGHT; 

} 

我無法訪問選定的文本它給了我「訪問衝突讀取位置0x00000020「錯誤..

+0

你確定'GetCurSel'不返回'CB_ERR'嗎? – 2013-03-12 10:27:09

+0

沒問題,我無法訪問CComboBox數組。 – 2013-03-12 10:29:35

+0

你什麼時候初始化'p_ComboBoxes'? – 2013-03-12 10:31:26

回答

0

如前所述,ON_CONTROL_REFLECT是針對在控制類中刪除消息,而不是在父級對話框類中。您應該在MyCComboBox類中實現您的OnCbnSelchange()處理程序,並在MyCComboBox消息映射中添加一個ON_CONTROL_REFLECT條目。

如果你真的想在父對話框中處理消息,你應該使用ON_CONTROL宏 - 每個子組合的每一個都有一個單獨的處理程序,因此你可以知道哪一個發送了消息。

+0

問題是我無法準確地知道在朗姆酒時間之前會創建多少個組合框。 – 2013-03-13 04:08:29

+0

這只是一個問題,如果您嘗試處理父對話框類中的消息。如果您在控件類中處理它,則創建組合的多少個實例並不重要。 – 2013-03-13 05:03:15

0

您也可以在父對話窗口中覆蓋OnCommand(WPARAM wParam, LPARAM lParam) 。如果HIWORD(wParam) == CBN_SELCHANGE,則將 LOWORD(wParam)與您的控件的ID進行比較。

BOOL CMyDlg::OnCommand(WPARAM wParam, LPARAM lParam) 
{ 
    if(HIWORD(wParam) == CBN_SELCHANGE) { //A combo box selection changed 
     int ID = LOWORD(wParam); //The ID of the corresponding ComboBox 
     //Perform additional handling... 
    } 
    return CDialog::OnCommand(wParam, lParam); 
}