MFC Combox 控件输入自动下拉提示
利用 CCombobox 实现百度,google 自动匹配
利用 VC 的 CCombobox 控件 实现百度,google 自动匹配,如图:
最终还是实现了:
实现方法:
思路其实很简单,首先把 CcomboBox 的属性设置为 droupdown, 在文本框中,当用户
需入文字时,查找与匹配符合条件的数据,找到后,将它们加载进 CCombobox 控件的下拉
列表中,然后下拉出来,展示给用户选择。
但是有三个问题待解决:
问题一.你的 item 列表中有一条记录,比如“自在飞花轻似梦”,而当用户只想输入“自
在”两个字时, 而变成它的“自在飞花轻 似梦”,且呈全部选中 状态,这个问题 是由于
ShowDropDown()函数调用后,这个函数在其内部自动进行了一项自动匹配工作,所以文本
被替换了
解决方法:把用户自已输入的字眼作为第一项供选,这样当用户只想输入“自在”时,文
本就不会变了。
问题二.当 CcomboBox 下拉框弹出时,发现鼠标的箭头不见了
解决方法:使用LoadCursor载入指定的光标资源就行了。
::SetCursor(LoadCursor(NULL,MAKEINTRESOURCE(IDC_ARROW)));// IDC_ARROW 标准的箭头
问题三:当输入一个字时,该字自动被选中,再输入下一个字时,上一个字会被覆盖,
所以永远只能输入一个字。
解决方法:使用SetEditSel设置光标在文本最后面,不选中任何字,就不会被覆盖了
代码如下:
自定义一个AutoComplete 的类继承CcomboBox,将AutoComplete与CcomboBox相关联,
在AutoComplete类中添加CBN_EDITUPDATE消息,即显示文本即将被更改
BEGIN_MESSAGE_MAP(AutoComplete, CWnd)
ON_CONTROL_REFLECT(CBN_EDITUPDATE, &AutoComplete::OnCbnEditupdate)
END_MESSAGE_MAP()
void AutoComplete::OnCbnEditupdate()
{
int countnum=GetCount();//得到Combox下拉框项目条数
if(countnum>0)
{
for(int i=0;iOpen((LPCTSTR)strSql,
WHERE PAY_NAME LIKE '%s%%'
_variant_t((IDispatch*)data.m_pConnection,true),adOpenStatic,adLockOp
timistic,adCmdText);
_variant_t vPayName;
long totalCount;
data.m_pRecordset->get_RecordCount(&totalCount);
if(totalCount == 0)
{
ShowDropDown(FALSE);//若没有查到,收起下拉框
return;
}
= 0;
int number
AddString(searchName);
while(!(data.m_pRecordset->adoEOF))
{
CString strLineNumber;
CString strName;
vPayName = data.m_pRecordset->GetCollect("PAY_NAME");
strName = vPayName;
AddString(strName);//加载到下拉框中
data.m_pRecordset->MoveNext();
}
data.m_pRecordset->Close();
::SetCursor(LoadCursor(NULL,MAKEINTRESOURCE(IDC_ARROW)));
//防止鼠标消失
ShowDropDown(TRUE);//显示下拉框
SetEditSel(searchName. GetLength (),GetLength.GetLength());
//置光标于文本最后,防止全部选中
}