logo资料库

MFC Combox自动提示输入.doc

第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
资料共3页,全文预览结束
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()); //置光标于文本最后,防止全部选中 }
分享到:
收藏