質問: AutoCompleteSource.CustomSource; ``` として、`textBox1.AutoCompleteCustomSource`に住所録の名前が入っているとします。 名前の文字を数文字入れるとサジェストされますが、その時の候補が出ているリストボックスの名前の横に、例えば電話番号や住所などを併記したいのです。 その併記情報をオーナードローで行えないか?と思うのですが、当方環境ではVisual Studio 2008付属のSpy++(32bit版/64bit版)がフッキングに失敗してWindowsメッセージを上手く取れないため分かりません(取れたところで実装方法が分かるかも怪しいのですが)。 別にオーナードローでなくても、見た目的に同じような事が出来れば構いません。 要は、こんな風にしたいという事です(画像は編集で作ってます)。 !オートコンプリートの例 このとき、赤枠で表示されているところは AutoCompleteCustomSourceコレクションに対応する別のコレクションでもいいですし、そもそもオートコンプリートを用いずに見た目的に同じなら、文字が入力されたときにテキストボックス下にリストボックス(リストビューの方がいい?)が表示されるでも構わないです。 これって結構難しいでしょうか?
回答: 技術的にオーナードローが実現できるかという点について調べてみましたが、Spy++にはAutoCompleteを設定したフォームを表示すると`Auto-Suggest Dropdown`というクラスの最上位ウィンドウが`TextBox`の数だけ作成されていました。その配下の`SysListView32`のhWndを取得して`SetWindowsHookEx`で表示のタイミングを把握し、`Graphics.FromHwnd`で得たコンテキストに描きこめば原理的にはオーナードロー可能なはずです。ただ`WM_PAINT`のタイミングではテキストが書かれていなかったのでどのメッセージが適切かは分かりません。