【问题标题】:CBN_SELCHANGE in Dynamically created ComboBoxes动态创建的组合框中的 CBN_SELCHANGE
【发布时间】:2013-03-12 10:22:21
【问题描述】:

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

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

【问题讨论】:

  • 你确定GetCurSel 不返回CB_ERR
  • 没问题,我无法访问 CComboBox 数组。
  • 什么时候初始化p_ComboBoxes
  • 在 OnInitDialog() 方法中。
  • 组合框不需要两步构造吗?因此,您还需要在数组中的每个组合框上调用 Create()。

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


【解决方案1】:

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

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

【讨论】:

  • 问题是我无法准确判断在 rumtime 之前会创建多少个组合框。
  • 如果您尝试在父对话框类中处理消息,这只是一个问题。如果您在控件类中处理它,那么您创建多少个组合实例并不重要。
【解决方案2】:

你也可以覆盖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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 2012-09-09
    相关资源
    最近更新 更多