动态创建的ComboBox中的CBN_SELCHANGE

时间:2013-03-12 10:22:22

标签: c++ visual-studio-2008 visual-c++ mfc

如何在动态创建的CComboBox中获取CBN_SELCHANGE ??我使用了CComboBoxes数组。

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

在消息Map of 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”错误..

2 个答案:

答案 0 :(得分:0)

如前所述,ON_CONTROL_REFLECT用于处理控件类中的消息,而不是父对话框类中的消息。您应该在MyCComboBox类中实现OnCbnSelchange()处理程序,并在MyCComboBox消息映射中添加ON_CONTROL_REFLECT条目。

如果你真的想在父对话框中处理这个消息,你应该使用ON_CONTROL宏 - 每个子组合有一个条目,每个子组合都有一个单独的处理程序,这样你就可以告诉哪一个发送了消息。

答案 1 :(得分: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);
}