オートコンプリートの使用

オートコンプリートは、 編集コントロール に部分的に入力された文字列を完全な文字列に展開します。 たとえば、ユーザーが Windows インターネット エクスプローラー ツール バーに埋め込まれているアドレス編集コントロールに URL を入力し始めると、オートコンプリートによって、既存の部分文字列と一致する 1 つ以上の完全な URL オプションに文字列が展開されます。 "mic" などの部分的な URL 文字列が "https://www.microsoft.com" に展開される場合があります。または "https://www.microsoft.com/windows"。 オートコンプリートは、通常、編集コントロール、または ComboBoxEx コントロールなどの埋め込み編集コントロールを持つコントロールで使用されます。

アプリケーションへのオートコンプリート機能の追加

アプリケーションは、次の 2 つの方法でオートコンプリート機能を編集コントロールに追加できます。

  • SHAutoComplete は、ファイル パスまたは URL をオートコンプリートできる単純な関数です。
  • IAutoComplete インターフェイスは、オートコンプリート オブジェクト (CLSID_AutoComplete) によって公開されます。 これにより、アプリケーションは オブジェクトを初期化、有効化、無効化できます。 IAutoComplete を使用すると、カスタム ソースを追加する機能など、オートコンプリート ソースをより細かく制御できます。 このトピックの残りの部分では、 IAutoComplete の使用について説明します。 特定の使用例については、「 手動でオートコンプリートを有効にする方法 」を参照してください。

オートコンプリート モード

IAutoComplete を使用する場合、オートコンプリートでは、オートコンプリートと autosuggest の 2 つのモードで、完成した文字列を表示できます。 モードは独立しています。または両方を有効にすることができます。 モードを指定するには、 IAutoComplete2::SetOptions を呼び出します。

Autoappend

自動適用モードでは、オートコンプリートによって、最も可能性の高い候補文字列の残りの部分が既存の文字に追加され、追加された文字が強調表示されます。 ユーザーが文字を入力し続ける場合は、既存の部分文字列に追加されます。 ユーザーが次に強調表示された文字と同じ文字を追加すると、その文字の強調表示はオフになります。 残りの文字は引き続き強調表示されます。 ユーザーが次に強調表示された文字と一致しない文字を追加すると、オートコンプリートは、大きな部分文字列に基づいて新しい候補文字列を生成しようと試み、新しい候補文字列の残りの部分を現在の部分文字列に追加します。 候補の文字列が見つからない場合は、型指定された文字のみが表示され、編集ボックスはオートコンプリートなしで動作します。 このプロセスは、ユーザーが文字列を受け入れるまで続行されます。

Autosuggest

autosuggest モードでは、オートコンプリートによってドロップダウン リストが表示され、編集コントロールの下に 1 つ以上の文字列が候補として表示されます。 ユーザーは、候補の文字列のいずれかを選択するか、入力を続けることができます。 入力が進むにつれて、現在の部分文字列に基づいてドロップダウン リストが変更される可能性があります。 IAutoComplete2::SetOptions で ACO_SEARCH フラグを設定した場合、オートコンプリートには、現在の部分文字列を検索するためのオプションがドロップダウン リストの下部に用意されています。 このオプションは、推奨される文字列がない場合でも表示されます。 ユーザーが検索オプションを選択した場合、アプリケーションはユーザーを支援する検索エンジンを起動する必要があります。

定義済みのオートコンプリート ソースの使用

オートコンプリートは、ユーザーの部分文字列と一致する文字列を提供するソースがあることによって異なります。 カスタム オートコンプリート ソースを提供するオプションがありますが、最も一般的なソースのいくつかがシステムによって提供されます。

CLSID_ACLHistory

ユーザーの履歴リストの URL リストと一致するオートコンプリート ソース。

CLSID_ACLMRU

ユーザーの最近使用したリストの URL リストと一致するオートコンプリート ソース。

CLSID_ACListISF

シェル名前空間内の項目と一致するオートコンプリート ソース: ユーザーのコンピューター上のファイルと、コントロール パネルなどの仮想フォルダー内のアイテム。

リソースをすぐに解放するのではなく、オートコンプリートに関係するさまざまなオブジェクトへのインターフェイス ポインターを保持したい場合があります。 特に、オートコンプリートの動作を動的に調整する場合に行われます。 この最も一般的なインスタンスは、シェル名前空間からオートコンプリートし、現在のディレクトリからの列挙のオプション (ACLO_CURRENTDIR) を持つ CLSID_ACListISF オブジェクトを使用する場合に発生します。 たとえば、新しいフォルダーに移動すると、インターネット エクスプローラーはアドレス バーの現在のディレクトリを変更するため、設定を動的に変更する必要があります。 CLSID_ACListISF オブジェクトが現在のディレクトリとして扱うディレクトリを指定するには、次の 2 つの方法があります。

次の例では、 pal が CLSID_ACListISF オブジェクトの IACList インターフェイスへのポインターであると仮定します。

  • IPersistFolder の使用:

    特定の ITEMIDLIST を現在のディレクトリとして扱う必要があることをCLSID_ACListISF オブジェクトに伝えるために、オブジェクトの 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();
    }