转载自http://blog.csdn.net/draren/archive/2007/05/25/1626274.aspx
顾顾ID:draren 的CSDN blog
提升用户输入效率的最佳做法之一是,为TextBox 与 ComboBox 控件加入自动完成功能。所谓自动完成功能,也就是当用户在输入某一个词句的时候,与已经输入的句首或词首相符的词句就会自动填入或显示出来让你选择。比如现在的google搜索的时候,你随便输入一点东西,会弹出与你输入最相近的一些搜索关键字。在.net中这个功能是很容易的,已经有相应的属性可以供使用。在vc6.0中好像没有,似乎没有这个功能。
使用以下代码可以简单的实现这个功能:
对ComboBox控件添加CBN_EDITCHANGE消息的处理函数,也就是当有输入发生改变的时候,自动调用该函数
添加代码如下:
假设ComboBox控件变量是 m_cbUserName, 临时变量 CString strTmp;则:
m_cbUserName.GetWindowText(strTmp);
int iLen = strTmp.getlength();
//...如果ilen=0可以直接返回
if(m_cbUserName.FindSTring(-1, strTmp) != -1)
{
m_cbUserName.SelectString(-1, strTmp);
}
m_cbUserName.SetEditSel(ilen,-1);
唯一的缺陷就是,如果你的列表中有王二小,而你又只想输入 王二 的话......
-------------------------------------------------------------------
多谢顾顾的思路
基于以上缺陷。
我拦截了pretranslatemsg函数
BOOL CLoginWnd::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN)
{
if (pMsg->wParam ==VK_BACK ||pMsg->wParam ==VK_DELETE )
{
if((GetFocus()->GetParent()) == GetDlgItem(IDC_COM_USER))
{
m_pComboUser->Cut();
AutoInput = FALSE;
}
}
}
return CFrameWnd::PreTranslateMessage(pMsg);
}
当用户输入del或者退格时 autoinput变量为false
而以上的函数改为
void CLoginWnd::OnEditchangeComboUser()
{
CString strTmp;
GetDlgItem(IDC_COM_USER)->GetWindowText(strTmp);
if (AutoInput)
{
int start= strTmp.GetLength();
if(start==0) return;
int find=m_pComboUser->FindString(-1,strTmp);
if (CB_ERR != find)
{
m_pComboUser->SelectString(-1, strTmp);
}
m_pComboUser->SetEditSel(start,-1);
}
AutoInput=TRUE;
}
至此,一个perfect的自动组合框完成。仅以此备注。