您的位置:首页 > 其它

MFC ComboBox控件中EditChange无反应

2017-01-18 22:33 483 查看
Hello, 大家好! 我有一个ComboBox控件,有CNB_SELECTCHANGE和CNB_EDITCHANGE两个消息映射,响应函数分别为OnEditChange和OnCmbSelectChang,

我操作的顺序是这样的:在控件中先从下拉列表选择一个选项,然后就修改控件中的内容。

问题在于:选择列表选项后,第一次修改控件内容没有改变并保持原来的内容,得第二次修改才会改变。原因在下面代码中的GetCurSel()函数中,在第一次修改后返回的还是选择列表的索引号而不是-1.

是我在select之后的处理问题吗?我想用UpdateData()来更新数据,但是工程里没有包含afxwin.h,添加了此函数会提示错误。

不是很明白MFC的原理,求高手解答?

以下是一部分代码:”
BEGIN_MSG_MAP(CComboBoxListControl)

    CHAIN_MSG_MAP(CListControl)

    COMMAND_CODE_HANDLER(CBN_EDITCHANGE, OnEditChange)

    COMMAND_CODE_HANDLER(CBN_SELCHANGE, OnCmbSelectChange)

{

    static int nNumber = 0;

AtlTrace(_T("Combo - <%d>- %d -\n"), nNumber++, uMsg);

}

ALT_MSG_MAP(1)

    COMMAND_CODE_HANDLER(CBN_EDITCHANGE, OnEditChange)

    COMMAND_CODE_HANDLER(CBN_SELCHANGE, OnCmbSelectChange)

END_MSG_MAP()

LRESULT CComboBoxListControl::OnEditChange(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)

{

    if (wID != GetControlID())

    {

        return bHandled = FALSE;

    }

    //if (!m_comboBox.GetDroppedState())

    {

        m_pList->ChangeControlNotify(this);

    }

    return bHandled = FALSE;

}

    

LRESULT CComboBoxListControl::OnCmbSelectChange(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)

{

    if (wID != GetControlID())

    {

        return bHandled = FALSE;

    }

    //if (!m_comboBox.GetDroppedState())

    {

        m_pList->ChangeControlNotify(this);

    }

    

m_comboBox.UpdateWindow();

    return bHandled = FALSE;

}

template <bool bIsCheckListView>

void CRichListControls<bIsCheckListView>::ChangeControlNotify(CListControl* pControl)

{

CListPosition lp = FindControlPosition(pControl);

SetItemText(lp.GetLine(), lp.GetColumn(), pControl->GetText(), false);

    CRichListControlData data(m_hWnd, lp);

    SendMessage(m_wndContained.m_hWnd, 

                WM_RICHLISTCONTROLS_MESSAGE, 

                WPARAM(rmtModify), 

                reinterpret_cast<LPARAM>(&data));

}

_bstr_t CComboBoxListControl::GetText() 

{

    CComBSTR bstr;

int nSel = m_comboBox.GetCurSel();

if ((-1 == nSel) && ((m_comboBox.GetWindowLong(GWL_STYLE) & CBS_DROPDOWNLIST) != CBS_DROPDOWNLIST))

{

m_comboBox.GetWindowText(&bstr);

}

else

{

m_comboBox.GetLBTextBSTR(nSel, bstr.m_str);

}

    return bstr.m_str;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: