如何在动态创建的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”错误..
答案 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);
}