65.9K
CodeProject 正在变化。 阅读更多。
Home

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

2002 年 2 月 26 日

2分钟阅读

viewsIcon

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;
}

使用方法

首先,确保在您的 CWinAppInitInstance 中调用了 ::CoInitialize(NULL);。如果没有这样做,对 SHAutoComplete 的调用将会失败。您还需要在您的 CWinAppExitInstance 中调用 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,感谢您宝贵的意见:)

© . All rights reserved.