无需平台 SDK 的自动完成编辑框和组合框






4.13/5 (9投票s)
2002 年 2 月 26 日
2分钟阅读

238193
如何在不下载整个平台 SDK 的情况下,为编辑控件和组合框启用文件系统和 URL 自动完成功能
引言
这是一篇快速的文章,展示了如何在您的编辑框和组合框中添加您在 Win2K 文件打开对话框中看到的便捷自动完成效果——而无需下载整个平台 SDK(在 56K 调制解调器上需要 9 小时!)。如果您已经拥有平台 SDK,那么这篇文章可能对您没有用处。
演示
我没有在此提供任何演示项目,因为代码足够小,您可以直接复制和粘贴(一个函数!)。
一些常量
这些将在平台 SDK 中定义,但由于我们不使用它,我将在这里包含它们。您需要将这些复制到您的应用程序中。
// See the MSDN for SHAutoComplete for a full // description of what these options do. #define SHACF_DEFAULT 0x00000000 #define SHACF_FILESYSTEM 0x00000001 #define SHACF_URLALL (SHACF_URLHISTORY | SHACF_URLMRU) #define SHACF_URLHISTORY 0x00000002 #define SHACF_URLMRU 0x00000004 #define SHACF_USETAB 0x00000008 #define SHACF_FILESYS_ONLY 0x00000010 #define SHACF_AUTOSUGGEST_FORCE_ON 0x10000000 #define SHACF_AUTOSUGGEST_FORCE_OFF 0x20000000 #define SHACF_AUTOAPPEND_FORCE_ON 0x40000000 #define SHACF_AUTOAPPEND_FORCE_OFF 0x80000000
简单的包装函数
typedef HRESULT (WINAPI *SHAUTOCOMPLETEFN) (HWND hTarget, DWORD dwFlags); static HINSTANCE hSHLWAPIDLL = NULL; bool SetupForAutoComplete(HWND hTarget, DWORD dwFlags) { if (hTarget == NULL) { return false; } bool ok = false; if (hSHLWAPIDLL == NULL) { hSHLWAPIDLL= LoadLibrary("SHLWAPI.DLL"); if (hSHLWAPIDLL== NULL) { return false; } } SHAUTOCOMPLETEFN pSHAC = (SHAUTOCOMPLETEFN)GetProcAddress(hSHLWAPIDLL, "SHAutoComplete"); if (pSHAC != NULL) { ok = SUCCEEDED(pSHAC(hTarget, dwFlags)); } return ok; }
使用方法
首先,确保在您的 CWinApp
的 InitInstance
中调用了 ::CoInitialize(NULL);
。如果没有这样做,对 SHAutoComplete
的调用将会失败。您还需要在您的 CWinApp
的 ExitInstance
中调用 CoUninitialize();
。这会为您的应用程序初始化 COM。
我还建议您在 CWinApp::ExitInstance()
中调用 FreeLibrary(hSHLWAPIDLL)
,以便善待操作系统。
现在是精华部分
如果您在对话框类中有一个与成员变量关联的编辑控件,您所需要做的就是
BOOL CMyDialog::OnInitDialog()
{
...
// enable auto complete for m_myEdit
SetupForAutoComplete(m_myEdit.m_hWnd,
SHACF_FILESYSTEM);
...
}
就这样。现在,当您开始键入路径时,编辑控件将显示一个列表框,其中包含与您键入内容匹配的路径——就像文件打开对话框一样。
如果您想对组合框执行此操作,则会稍微复杂一些
BOOL CMyDialog::OnInitDialog() { ... // the edit control of a CComboBox is always at dlg ID 1001 CEdit * pMyEdit = (CEdit *)m_myCombo.GetDlgItem(1001); if (pMyEdit) { // enable auto complete for m_myCombo SetupForAutoComplete(pMyEdit->m_hWnd, SHACF_FILESYSTEM); } ... }
就这样了。
关注点
这整个事情的核心是 SHAutoComplete
。这是一个位于 Shlwapi.DLL 中的函数,仅在 Win2K 或安装了 IE 5.0 或更高版本的机器上可用。但是,您可以安全地调用我的 SetupForAutoComplete
函数,即使机器不满足这些要求,因为该函数会检查 DLL,然后检查特定的函数。如果两者都不存在,该函数将优雅地退出。
更多信息
SHAutoComplete
可以做的不止文件系统自动完成。它还可以做 URL 自动完成(就像 IE 中的导航栏一样),并且可以使用各种其他有趣选项。有关这些选项的完整说明,请参阅 MSDN 中的 SHAutoComplete
。
就这样了。请负责任地享受。哦对了,感谢 Michael Dunn,感谢您宝贵的意见:)