动态创建的组合框中的CBN_SELCHANGE

CBN_SELCHANGE in Dynamically created ComboBoxes

本文关键字:CBN SELCHANGE 创建 组合 动态      更新时间:2023-10-16

如何在动态创建的ccombobox中获得CBN_SELCHANGE ?我使用了一个ccombobox数组

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

MyCComboBox的message Map

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"错误..

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

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

您也可以覆盖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);
}
相关文章:
  • 没有找到相关文章