源文件
- DYNAMIC(CLJCComboBox, CComboBox)
CLJCComboBox::CLJCComboBox()
: m_bAutoComplete(FALSE)
{
}
CLJCComboBox::~CLJCComboBox()
{
}
BEGIN_MESSAGE_MAP(CLJCComboBox, CComboBox)
ON_CONTROL_REFLECT(CBN_EDITCHANGE, &CLJCComboBox::OnCbnEditchange)
ON_WM_CHAR()
ON_CONTROL_REFLECT(CBN_DROPDOWN, &CLJCComboBox::OnCbnDropdown)
END_MESSAGE_MAP()
// CLJCComboBox message handlers
void CLJCComboBox::OnCbnEditchange()
{
CString line; // partial line entered by user
CString sMatchedText; // holds full line from list
// get the text from the user input
GetWindowText(line);
int iHiLightStart = line.GetLength();
// if the line is empty
if(line.GetLength() == 0)
{
// 关闭下拉框
ShowDropDown(FALSE);
// empty the selection
SetWindowText(_T(""));
m_bAutoComplete = true;
return;
}
// 这里处理删除操作的逻辑
if(!m_bAutoComplete)
{
m_bAutoComplete = true;
return;
}
// 开始匹配用户输入
int m_iSelectedRow = FindString(-1, line);
if(m_iSelectedRow >= 0)
{
// 打开下拉框
ShowDropDown(TRUE);
// 注意这里一定要使用postmessage以保证下拉框的选项被选中!
PostMessage(CB_SETCURSEL, m_iSelectedRow, 0);
//使用SendMessage 在Unicode对话框工程里正常,在多字节单文档工程里下拉框
//选项不会被选中 SetCurSel同样也是
//SendMessage(CB_SETCURSEL, m_iSelectedRow, 0);
//SetCurSel(m_iSelectedRow);
}
// 接下来处理匹配失败
else
{
ShowDropDown(FALSE);
SetWindowText(line);
}
// 最后我们要高亮自动匹配的部分,以方便用户继续编辑,同样的要用异步消息发送
PostMessage(CB_SETEDITSEL, 0, MAKELPARAM(iHiLightStart, -1));
//使用SendMessage 在Unicode对话框工程里正常,在多字节单文档工程里
//会选中所有文本 SetCurSel同样也是
//SendMessage(CB_SETEDITSEL, 0, MAKELPARAM(iHiLightStart, -1));
//SetEditSel(iHiLightStart,-1);
}
BOOL CLJCComboBox::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN)
{
m_bAutoComplete=true;
int nVirtKey=(int)pMsg->wParam;
if(nVirtKey==VK_DELETE||nVirtKey==VK_BACK)
m_bAutoComplete=false;
}
return CComboBox::PreTranslateMessage(pMsg);
}
void CLJCComboBox::OnCbnDropdown()
{
SetCursor(LoadCursor(NULL, IDC_ARROW)); //避免下拉框打开后鼠标消失
}
头文件
#pragma once
// CLJCComboBox
class CLJCComboBox : public CComboBox
{
DECLARE_DYNAMIC(CLJCComboBox)
public:
CLJCComboBox();
virtual ~CLJCComboBox();
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnCbnEditchange();
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
virtual BOOL PreTranslateMessage(MSG* pMsg);
private:
BOOL m_bAutoComplete;
public:
afx_msg void OnCbnDropdown();
};