要最简单地实现AutoComplete只要下面那样ShAutoComplete即可:
SHAutoComplete(GetDlgItem(hDlg,IDC_EDIT2),SHACF_FILESYSTEM|SHACF_AUTOSUGGEST_FORCE_ON);
SHAutoComplete第个参数是editControl控件句柄(或者是ComboBox中editControl控件句柄)第 2个参数是些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);
然后设置些参数比如:是否启用AutoAppendAutoSuggest等:
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;
(pceltFetched)*pceltFetched=0;
for (;m_idx<()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]);
(pceltFetched) (*pceltFetched);
}
icelt?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
最新评论