MFC ComboBox控件中EditChange无反应
2017-01-18 22:33
483 查看
Hello, 大家好! 我有一个ComboBox控件,有CNB_SELECTCHANGE和CNB_EDITCHANGE两个消息映射,响应函数分别为OnEditChange和OnCmbSelectChang,
我操作的顺序是这样的:在控件中先从下拉列表选择一个选项,然后就修改控件中的内容。
问题在于:选择列表选项后,第一次修改控件内容没有改变并保持原来的内容,得第二次修改才会改变。原因在下面代码中的GetCurSel()函数中,在第一次修改后返回的还是选择列表的索引号而不是-1.
是我在select之后的处理问题吗?我想用UpdateData()来更新数据,但是工程里没有包含afxwin.h,添加了此函数会提示错误。
不是很明白MFC的原理,求高手解答?
以下是一部分代码:”
我操作的顺序是这样的:在控件中先从下拉列表选择一个选项,然后就修改控件中的内容。
问题在于:选择列表选项后,第一次修改控件内容没有改变并保持原来的内容,得第二次修改才会改变。原因在下面代码中的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; }