エディットボックスに対してオートコンプリートを実装する。

GetOpenFileName / GetSaveFileName で開くコモンダイアログのファイル名のエディットボックス*1に、手動でパスを入力していくと候補が勝手に出てきて手軽にファイル名を選択することが出来るじゃないですか。

http://ir9.jp/hd/hd070610_00.png

この機能、自前アプリケーションでも使いたいなぁーと常々思っていたのですが、エディットコントロールの Style を見てもそんな項目は無く、どうするのかしらと。 調べようにも、この機能の名称がわからねぇ。 ついでに、COMが出てきて CoCreateInstance して QueryInterface して キャッキャウフフ する必要があるんだろうなー。色々面倒そうかしらー。 ってことで、今まで特に調べもせず過ごしてきました。



が、今日になって突然なぜかキーワードが浮かんだ。そう「オートコンプリート」だと! なんで気づかなかったんだ俺!!!

というわけで、COMで面倒なんだろうなぁーと思いつつもぐぐる先生で調べてみたところですね、

SHAutoComplete 関数ひとつ呼んであげればOKです。

えっ?




……あぁそうか、この関数の引数が面倒なことになっているわけか。インターフェースポインタへのポインタを渡してインスタンスを受け取るとか、ややこしいことになってるんだろなぁ。そうかそうかー。そうだよなー。あははー

HRESULT SHAutoComplete(
HWND hwndEdit,
DWORD dwFlags
);

SHAutoComplete function | Microsoft Docs

引数2つだとッ!?



な、何たること! なんでこんなに設定が簡単なんだ! エディットボックスへのハンドル渡して、動作フラグ渡すだけじゃん! MessageBox より簡単じゃねぇのこれ!?

実装してみた。

Visual Studio 2003 の Windows アプリケーションスケルトン の AboutBox に、エディットボックスひとつ貼り付けて実装してみました。

WinMain の始まりに CoInitializeを。終わりに CoUninitialize を書いて…

case WM_INITDIALOG:
  {
    // コレだけ。
    ::SHAutoComplete(::GetDlgItem(hDlg, IDC_EDIT1), SHACF_FILESYSTEM);
  }
return TRUE;

を追加。そして結果は…

http://ir9.jp/hd/hd070610_01.png

やべー。マジ簡単だこれー。正直惚れた。 薔薇乙女メールチェッカーで活用しよう。うん。

とはいえ

CoInitialize / CoUninitialize は呼ばなくてはならないので、内部では COM を利用している模様です。 ついでに、詳細な動作の設定を行いたい場合はやっぱり COM を弄くる必要がある様です。

それでも、大抵 ディレクトリ / フォルダ の補完で事済んじゃうべー。 というわけで、オートコンプリートで COM を弄くる必要性ってのは殆どなさそうな感じ。

大いに利用してみる価値があると思うのかしらー。

*1:よく見たらこれコンボボックスだコレー!?