介绍 已经有好几篇文章介绍了CodeProject上的自动完成函数。许多子类包含CEdit或CComboBox,并完成控件中的输入或在下拉列表中显示各种类型。另一种选择是使用IAutoComplete和IEnumString以及许多其他I函数。 当我看到Klaus Probst设计的wtl自动完成功能时,我想,“很酷,但即使没有ie浏览器和神秘的调用,所有这些都应该可以工作”。而且,相当容易。 如何使用 复制文件(ACEdit。(ACListWnd.cpp/h + ACListWnd.cpp/h),然后将它们添加到项目并插入头,最好是在stdafx.h中。隐藏,声明一个CEdit或CComboBox并子类化它到CACEdit隐藏 复制Code
bevorehand: CEdit m_EditCtrl1; afterwards: CACEdit m_EditCtrl1;
然后初始化控件并定义模式,例如在OnInitDialog中。隐藏,复制Code
m_EditCtrl1.Init(); m_EditCtrl1.SetMode(); // default = _MODE_STANDARD_
可能的模式有: _MODE_STANDARD_ _MODE_SEPARATION_ _MODE_FILESYSTEM_ _MODE_FS_ONLY_FILE_ _MODE_FS_ONLY_DIR_ _MODE_FS_START_DIR_ _MODE_SD_ONLY_FILE_ _MODE_SD_ONLY_DIR_ _MODE_CURSOR_O_LIST_ _MODE_FIND_ALL_。 请往下看更多的解释。如果您忘记了Init(),初始化将在稍后的SetMode()中完成。 最后,插入字符串。有两种不同的方法可以做到这一点:AddSearchString和AddSearchStrings。隐藏,复制Code
m_EditCtrl1.AddSearchString("Test1"); m_EditCtrl1.AddSearchString("Test2"); m_EditCtrl1.AddSearchString("Tiger"); m_EditCtrl1.AddSearchString("Dog"); or static LPCTSTR STRINGS[] = { _T("Test1"), _T("Test2"), _T("Tiger"), _T("Dog"), NULL }; m_EditCtrl1.AddSearchStrings(STRINGS);
在插入字符串之前,函数AddSearchStrings()调用RemoveSearchAll(),并清除CStringArray类型的内部项列表。AddSearchStrings()可以与AddSearchString()结合使用,但反之则不行。字符串的特定删除目前还没有实现。 这是我们需要一个简单的自动完成。此外,还有可能实现分离器。m_EditCtrl1.SetSeparator (_T (" \ \ "));使\起作为一行的开始或结束的作用。如果您输入XXX\t\YYY,在我们的示例中,您将看到一个包含Test1、Test2和Tiger的列表。 但是,如果用户输入xxTi,则失败。如果你使用常数,比如<Parameter1>(在我们的例子中,用大括号括起来的常量<>)然后可以使用前缀来扩展命令SetSeparator(),前缀是常量的第一个符号。前缀不能是searchstring的一部分。但是,它确实出现在列表中,并且是结果的一部分。隐藏,复制Code
... m_EditCtrl1.AddSearchString("PARAMETER1>"); // without prefix! m_EditCtrl1.AddSearchString("PARAMETER2>"); m_EditCtrl1.AddSearchString("PARAMETER3>"); m_EditCtrl1.SetSeparator("<",'<'); ...
如果输入了XXX<,这个示例也会产生结果。或/ & lt;。 和文件系统的自动完成:复制Code
... m_DirEdit.SetMode(_MODE_FILESYSTEM_); ...
现在,当您开始键入路径时,控件将下拉一个路径列表,其中的路径与您迄今为止在开始菜单中键入的路径相匹配——run-command(在Win2K或IE 5.0机器上)。 SetMode(_MODE_FS_ONLY_FILE_)只列出文件,而SetMode(_MODE_FS_ONLY_DIR_)只列出目录。隐藏,复制code
m_DirEdit.SetMode(_MODE_FS_START_DIR_); m_DirEdit.SetStartDirectory(_T("C:\\Windows\\")); ...
如果你使用SetMode() _MODE_FS_START_DIR_, _MODE_SD_ONLY_FILE_或_MODE_SD_ONLY_DIR_目录可以由SetStartDirectory()表示。 在上面的示例中,控件列出了C:\窗口中的所有文件,但与_MODE_FILESYSTEM_不同,它没有显示路径(C:\窗口)。 版本1.2 OnGetMinMaxInfo()遵循“yogurt”(cp. comments)的建议-_MODE_FIND_ALL_ for SetMode()如果你进入,函数会发现One, One1, Melon, Lemon,… 版本1.1 -int GetLBText(int nIndex, LPTSTR lpszText);-void GetLBText(int nIndex, CString&-int SelectString(int nStartAfter, LPCTSTR lpszString);-void ShowDropDown(BOOL bShowIt = TRUE);-void ResetContent();-int GetCurSel() 如果使用SetMode()设置了这个标志,那么已经可以在一个空的输入字段中用光标键(向上/向下)指示搜索字符串列表。但是,这只适用于CEdit控件,因为组合框中的光标键有不同的功能。 结论控制看起来像Windows中的功能(触发了项目),但它完全不需要IAutoComplete。当然有很多扩展它的方法,但是由于它以它应该的方式工作,我对它没有意见。希望这个控件对你们有用-我写的很有趣。 来源: IAutoComplete和自定义IEnumString实现的WTL对话框 (克劳斯·普罗斯特)我的灵感 自动完成和ACTest演示应用(Paul DiLascia)组合框/编辑控件的识别技巧 增强的CCheckComboBox (Magerusan Grigore Cosmin)显示了如何在选中时保持窗口不活动(创建) 本文转载于:http://www.diyabc.com/frontweb/news244.html