使用自動完成
自動完成會將已在 編輯控制項 中部分輸入的字串展開成完整的字串。 例如,當使用者開始在內嵌于 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
-
與使用者 [歷程記錄] 清單中的 URL 清單相符的自動完成來源。
-
CLSID_ACLMRU
-
與使用者最近使用清單中的 URL 清單相符的自動完成來源。
-
CLSID_ACListISF
-
符合 Shell 命名空間中專案的自動完成來源:使用者電腦上的檔案,以及虛擬資料夾中的專案,例如主控台。
有時候,您可能想要保留與自動完成相關的各種物件的介面指標,而不是立即釋放資源。 特別是,當您想要動態調整自動完成行為時,就會完成此動作。 使用從 Shell 命名空間自動完成的 CLSID_ACListISF 物件時,就會發生此情況的最常見實例,且選項 (ACLO_CURRENTDIR) 從目前目錄列舉。 例如,當您流覽至新資料夾時,Internet Explorer 會變更網址列的目前目錄,因此必須動態變更設定。 有兩種方式可以指定CLSID_ACListISF物件應該視為目前目錄的目錄:
- IPersistFolder 會透過 ITEMIDLIST指定目錄。
- ICurrentWorkingDirectory 會透過路徑字串指定目錄。
在下列專案中,假設 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(); }
-
若要提供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(); }