Win32编程点滴4 - 玩转AutoComplete

AutoComplete/AutoSuggest是很多web程序喜欢用的技术,尤其是像Google的搜索框之类的。在Windows程序中也有这样的应用,比如:“运行”对话框或者是ie的地址栏等。这篇文章就来简单介绍一下,使用Windows shell自带的AutoComplete组件,实现具有AutoComplete功能的输入框。

SHAutoComplete

要最简单地实现AutoComplete,只要下面那样调用ShAutoComplete函数即可:

SHAutoComplete(GetDlgItem(hDlg,IDC_EDIT2),SHACF_FILESYSTEM|SHACF_AUTOSUGGEST_FORCE_ON);

SHAutoComplete的第一个参数,是edit控件的句柄(或者是ComboBox中edit控件的句柄)。第二个参数是一些flag,来控制提示的内容来自于文件系统(SHACF_FILESYSTEM等)还是历史url地址(SHACF_URLHISTORY,SHACF_URLMRU等),或者全部。同时,还可以控制是否强制启用或关闭AutoAppend和AutoSuggest功能。这两种功能的默认设置在ie的设置程序中或在注册表中:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\AutoComplete
  • AutoAppend 指的是根据你当前输入的内容,自动插入剩余的部分。例如:在AutoComplete的系统中存在apple这个词条,那么当你键入app的时候,则系统会自动插入剩下的le,并将le以选中的方式显示。类似于:app|le  
  • AutoSuggest 启用的话,会自动出现下列表框显示候选的内容。

最后,不要忘记在程序开头调用CoInitialize,因为这东西和com有关。

自定义AutoComplete

SHAutoComplete的功能是十分的局限的,只能提供文件系统或url地址的自动完成。在大部分情况下,我们需要对自动完成的内容自定义。这时,我们需要的是shell提供的AutoComplete对象,并实现IEnumString接口。简单的代码如下:

IAutoComplete * pac;
CoCreateInstance(CLSID_AutoComplete,NULL,CLSCTX_INPROC_SERVER,IID_IAutoComplete,(void**)&pac);
pac->Init(GetDlgItem(IDC_EDIT3),<你实现的IEnumString指针>,0,0);

然后,设置一些参数,比如:是否启用AutoAppend,AutoSuggest等:

IAutoComplete * pac2;
pac->QueryInterface(IID_IAutoComplete2,(void**)&pac2);
pac2->SetOptions(ACO_AUTOSUGGEST|ACO_AUTOAPPEND|ACO_UPDOWNKEYDROPSLIST);

最后,说明一下IEnumString的实现。IEnumString类似于大部分的IEnumXXXX本身非常简单,唯一需要提一下的就是IEnumString::Next返回字符串需要调用CoTaskMemAlloc分配内存。代码如下:

STDMETHOD(Next( ULONG celt,LPOLESTR * rgelt,ULONG * pceltFetched))
{
ULONG i=0;
if (pceltFetched)*pceltFetched=0;
for (;m_idx<(int)m_vec.GetCount() && i<celt;++i,++m_idx)
{
//注意CoTaskMemAlloc接受的参数是字节数,GetLength是返回的字符数。并要加上结尾'\0'的字节
rgelt[i] =(LPOLESTR)CoTaskMemAlloc(2 + m_vec[m_idx].GetLength() * 2);
wcscpy(rgelt[i],m_vec[m_idx]);
if (pceltFetched) ++(*pceltFetched);
}
return i==celt?S_OK:S_FALSE;
}

这样,遍完成了自定义的AutoComplete。很简单,不是吗?

更进一步

如果候选的内容比较多,为了提高性能,可以再实现IACList接口。IACList只有一个方法:

HRESULT Expand(LPCWSTR pszExpand);

每次Expand被调用的时候,便生成一个pszExpand开头的候选列表。之后IEnumString接口的方法被调用的时候,就从这个列表中取字符串。

例如:做一个文件系统的自动完成。用户输入"C:\",然后Expand(L"C:\\")被调用,则枚举C:\下面所有文件保存起来,然后IEnumString的方法则返回这些文件的路径。

另外,windows还提供的Compound AutoComplete等等这些组件。关于这些,请看Using Autocomplete

转载于:https://www.cnblogs.com/Greatest/archive/2009/09/07/1561970.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值