共用方式為


使用自動完成

自動完成會將部分輸入的字串在 編輯控制項 中展開成完整字串。 例如,當使用者開始在內嵌於 Windows Internet Explorer 工具列的 [位址編輯] 控制項中輸入 URL 時,自動完成會將字串展開為一或多個與現有部分字元串一致的完整 URL 選項。 部分 URL 字串,例如 「mic」 可能會展開為 「https://www.microsoft.com"或 「https://www.microsoft.com/windows"」。 自動完成通常與編輯控件或具有內嵌編輯控件的控件搭配使用,例如 ComboBoxEx 控制件。

將自動完成功能新增至您的應用程式

應用程式可以透過兩種方式將自動完成功能新增至編輯控制項:

  • SHAutoComplete 是可自動完成檔案路徑或 URL 的簡單函式。
  • IAutoComplete 介面是由自動完成物件公開(CLSID_AutoComplete)。 它可讓應用程式初始化、啟用和停用 物件。 IAutoComplete 允許對自動完成來源進行更多控制,包括新增自定義來源的能力。 本主題的其餘部分討論如何使用 IAutoComplete。 如需特定使用範例,請參閱 如何手動啟用自動完成

自動完成模式

使用 IAutoComplete時,自動完成可以透過兩種模式顯示已完成的字串:autoappend 和 autosuggest。 模式是獨立的,您可以啟用任一模式或兩者皆啟。 若要指定模式,請呼叫 IAutoComplete2::SetOptions

自動附加

在自動附加模式中,輸入自動完成會將最有可能的候選字串的其餘部分附加到現有的字元上,並反白顯示這些附加的字元。 如果使用者繼續輸入字元,則會將其新增至現有的部分字串。 如果使用者新增的字元與下一個已高亮顯示字元相同,則該字元的高亮顯示會被關閉。 其餘字元仍會反白顯示。 如果使用者新增不符合下一個醒目提示字元的字元,自動完成會根據較大的部分字串產生新的候選字串,並將新候選字串的其餘部分附加至目前的部分字串。 如果找不到候選字串,則只會顯示輸入的字元,編輯框的行為會如同沒有自動完成一樣。 此程式會繼續執行,直到使用者接受字串為止。

自動建議

在自動建議模式中,自動完成會在編輯控件下方顯示下拉式清單,其中包含一或多個建議的完整字串。 用戶可以選取其中一個建議的字串,或繼續輸入。 隨著輸入進度,下拉式清單可能會根據當前輸入的部分字串修改。 如果您在 IAutoComplete2::SetOptions中設定ACO_SEARCH旗標,autocomplete 會在下拉式清單底部提供選項來搜尋目前的部分字元串。 即使沒有建議的字串,也會顯示此選項。 如果使用者選取搜尋選項,您的應用程式應該啟動搜尋引擎來協助使用者。

使用預先定義的自動完成來源

自動完成取決於是否有一個來源,能提供與使用者輸入的部分字串相匹配的字串。 您可以選擇提供自定義自動完成來源,但系統會提供數個最常見的來源。

CLSID_ACLHistory

與使用者歷程記錄清單中的網址清單相符的自動完成來源。

CLSID_ACLMRU

與使用者最近使用清單中的URL清單相符的自動完成來源。

CLSID_ACListISF

與 Shell 命名空間中的專案相符的自動完成來源:用戶電腦上的檔案,以及控制面板等虛擬資料夾中的專案。

有時候,您可能想要保留與自動完成相關的各種物件介面指標,而不是立即釋放資源。 特別是當您想要動態調整自動完成行為時,就會這麼做。 使用 CLSID_ACListISF 物件時,最常見的情況是它從 Shell 命名空間自動完成,並且也具有從目前目錄列舉的選項(ACLO_CURRENTDIR)。 例如,當您流覽至新資料夾時,Internet Explorer 會變更網址列的目前目錄,因此必須動態變更設定。 有兩種方式可以指定CLSID_ACListISF對象應該視為目前目錄的目錄:

在下列範例中,假設 pal 是 CLSID_ACListISF 物件的 IACList 介面指標:

  • 使用 IPersistFolder

    若要告訴CLSID_ACListISF對象,應該將特定 ITEMIDLIST 視為當前目錄,您可以使用物件的 IPersistFolder 介面。 由於 ITEMIDLIST 可以參考虛擬資料夾,因此此方法比使用 ICurrentWorkingDirectory更有彈性。

    請注意,下列範例使用範本化 QueryInterface,其允許簡化的參數清單。

    IPersistFolder *ppf;
    
    hr = pal2->QueryInterface(IID_PPV_ARGS(&ppf));   
    if (SUCCEEDED(hr))
    {
        hr = ppf->Initialize(pidlCurrentDirectory);
        ppf->Release();
    }
    
  • 使用 ICurrentWorkingDirectory

    若要將CLSID_ACListISF物件指定為目前目錄的路徑,您可以使用物件的 ICurrentWorkingDirectory 介面。

    WCHAR pwszDirectory[MAX_PATH] = L"C:\\Program Files";
    ICurrentWorkingDirectory *pcwd;
    
    hr = pal2->QueryInterface(IID_PPV_ARGS(&pcwd));    
    if (SUCCEEDED(hr))
    {
        hr = pcwd->SetDirectory(pwszDirectory);
        pcwd->Release();
    }