2013-03-12 87 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); 
}