ComboBoxのオートコンプリートの候補表示について

タグの編集
投稿者 alvin  (社会人) 投稿日時 2010/1/20 03:13:35
お世話になっております。
早速ですが、質問させていただきます。

ComboBoxのオートコンプリートを有効にした場合、
一文字を入力して表示される候補一覧のフォントは制御可能でしょか?

ComboBoxに手入力したときと同じフォントにしたいですが、
教えてください。
投稿者 在浩  (社会人) 投稿日時 2010/1/21 09:34:58
例えば..

Private Sub Form_Load()
   cbo1.Font.Bold = True
End Sub

ご希望の回答になりましたかどうかよく分からないです。
投稿者 alvin  (社会人) 投稿日時 2010/1/21 22:04:20
Private Sub Form_Load()
   cbo1.Font.Bold = True
End Sub

ですと、太字にする設定かと思いますが、
入力のみ有効で、候補一覧のフォントは変わらないみたいです。
投稿者 (削除されました)  () 投稿日時 2010/1/22 03:10:01
(削除されました)
投稿者 在浩  (社会人) 投稿日時 2010/1/22 03:12:20
残念に思う。
私が理解できないでした。

私の知る限りでは可能だと思うことはありません。
おそらく、RichTextBoxコントロールのように複数のフォントを支援するコントロールではないみたいですが
ただし、可能な限り可能にするコードを作成しました。

Option Explicit

Private Sub cbo1_DropDown()
   cbo1.Font.Italic = True
End Sub

Private Sub cbo1_KeyDown(KeyCode As Integer、Shift As Integer)
   cbo1.Font.Italic = False
End Sub

Private Sub cbo1_LostFocus()
   cbo1.Font.Italic = True
End Sub

Private Sub Form_Load()
   cbo1.Font.Italic = True
End Sub

このコードの欠点は、dropdownしているときにCOMBO BOXの特質上のようなフォントを維持するということです。
より良い方法を提示して釘して申し訳ありません。 Q.Q
投稿者 alvin  (社会人) 投稿日時 2010/1/22 04:38:01
うん・・・
コードがなにを書こうとしているのがよくわかりません。

コンボボックス.Fontは入力時のフォンでないでしょうか?

候補一覧表示時とは違うのでは?
投稿者 在浩  (社会人) 投稿日時 2010/1/22 04:49:26
コードをコピー、ペーストしてビルドすると、違いを感じることができます...
投稿者 alvin  (社会人) 投稿日時 2010/1/22 05:05:25
ItalicプロパティはReadOnlyeだし、
書いていただいたコードも斜体にするだけでしょう・・・

申し訳ないですが、質問の内容を理解してから返答お願いします。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2010/1/22 05:46:37
> 質問の内容を理解してから返答お願いします。
その前に、質問時に環境を明記した方が良いですよ。


> ItalicプロパティはReadOnlyeだし、
そんな事は無いですよ。stdole.StdFont オブジェクトの Italic プロパティは
ReadOnly ではありません。(在浩さんが書かれているのは恐らく、VB6 版のコードです)

# 在浩さんは多分、「候補一覧のフォント」というのを、
# ドロップダウンリスト内のフォントと解釈したのだと予想…。


> ComboBoxのオートコンプリートを有効にした場合、
VB でオートコンプリートを実装する場合、以下のような手法が使われますね。

 で URL 等をオートコンプリートさせる場合、SHAutoComplete を使います。
文字列を ComboBox 自身内から選ばせる場合には、CB_FINDSTRING が使われます。
また、データをプログラムから指定する必要がある場合には、多少難易度が上がりますが、
IAutoComplete を使う方法が知られています。

一方、 以降の場合には、AutoCompleteMode プロパティ等を利用して
より簡単に実装できます。ただし AutoCompleteMode は、では利用できません。


あるいはそれらの機能に頼らず、Googleサジェストのように、自分で同等機能を
作り上げる事も不可能ではないでしょう。

# alvin さんがどのようにしてオートコンプリートを有効化しているのかは分かりませんが、
# AutoCompleteMode を使っているのかな?

で、そのフォントを変更できるかというと…標準機能のオートコンプリートに対しては、
正攻法では変更できないと思います。自作したものであればどうとでも加工できるでしょうけれども。
投稿者 alvin  (社会人) 投稿日時 2010/1/22 06:06:05
-o-
環境はVS2008 VB.NET3.5、VISTAです~

現在はAutoCompleteModeを利用しております。
おしゃってる通り、標準機能でのオートコンプリートは制御むずかしいかと。
WEBで結構な時間かけて検索しても、それらしい答えが出てこないです。

http://bbs.wankuma.com/index.cgi?mode=al2&namber=45682
こちらでも質問してましたが、はやり自作という結論に至りました。

オートコンプリート機能は、後付の機能でもあるし、
ということで、デフォルトのままでいいかと問い合わせ中です。

対策が必要となっている場合、機能の自作も検討してみます。

皆さん、ご協力ありがとうございました。
感謝致します。
投稿者 (削除されました)  () 投稿日時 2010/1/22 06:55:26
(削除されました)
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2010/1/22 07:02:21
> はやり自作という結論に至りました。
「やはり」の書き間違い?


で。正攻法では変更できないというだけで、やってやれない事も無いとは思います。

Vista 環境ではどうだか分かりませんが、手元の XP 環境では、ComboBox の
AutoCompleMode/AutoCompleSource にて表示される候補ウィンドウ(実体は ListView) の
ウィンドウハンドルに対して、Font.ToHfont() で得たフォントハンドルを WM_SETFONT で
送出してやることで、フォントが変更される事を確認しています。


まぁ、推奨できる話でも無いので、
> デフォルトのままでいいかと問い合わせ中です。
で済むのであれば、その方が良いとは思いますよ。
投稿者 (削除されました)  () 投稿日時 2010/1/22 08:09:09
(削除されました)
投稿者 在浩  (社会人) 投稿日時 2010/1/22 08:11:10
日本では。Netのバージョンが主流となってありますね。韓国でも。netの研究が活発だがそれでも中学生から。netのバージョンが書かれている場合は稀です。もしかしたら、ここのサイトも。netのサイトなのに私が間違って入ってきたのでしょうか?

一度、ご質問の内容を理解せず、時間激しくて申し訳ないと思っています。

本人は。netをまだ知らない。したがって、理解していただきたいおかげだと思います。
投稿者 alvin  (社会人) 投稿日時 2010/1/22 08:48:37
在浩さん、こちらこそすみません・・
開発環境を先に書きませんでしたので。

魔界の仮面弁士さん、提示したキーワードで試してみます。
万が一の場合を備えて。
どうもありがとうございました。
投稿者 alvin  (社会人) 投稿日時 2010/1/22 08:55:41
「候補ウィンドウ(実体は ListView) のウィンドウハンドルに対して、
Font.ToHfont() で得たフォントハンドルを WM_SETFONT で送出」とありますが、
1.候補ウィンドウのハンドル取得は?
2.Wm_SETFONTを送出タイミング(どのイベント)は?
という疑問を抱えておりまして、もうすこし説明して戴けないでしょうか
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2010/1/22 18:20:24
> もうすこし説明して戴けないでしょうか
それらの点は、私も情報としては持ち合わせていません。
技術的に可能であるという点を調べたのみです。


> 1.候補ウィンドウのハンドル取得は?
私が試した時はただの実験コードでしたので、マウスカーソル位置にあるウィンドウを
調べるために、VB6 から WindowFromPoint でタイマー監視しました。

そして候補ウィンドウが一度消えてから、再度表示された後も、同じ HWND が得られたため、
そこで得た HWND を Spyxx.exe で確認した所、実体が ListView であり、それらの
表示/非表示が切り替わっている事が分かりました。
まずは、Vista でも同様の動作であるかどうかを確認した方が良いでしょう。

その結果、XP と同じ動作であるならば、VB.NET からは FindWindowEx などを通じて、
クラス名からウィンドウを取得できるかもしれません。試してはいないですけれども。


> 2.Wm_SETFONTを送出タイミング(どのイベント)は?
Wm_SETFONT ではなく WM_SETFONT ですが、それはともかく。

1. で調べた際には、候補ウィンドウが表示されていないときもウィンドウ自体は
存在していたので、TextBox に 1. で調べたハンドルを入力し、それを Button.Click で
送出するような VB.NET アプリを記述したのみです。実際の運用で、どのタイミングが
適切かは試行錯誤してみてください。もっとも、既定のオートコンプリートのままで
済むように、仕様を見直して頂けるように働きかけるべきだとは思いますけれども。


ちなみに私は、Form1.Load で Button1.Font.ToHfont() をフィールドに取得しておき、
それを Button1.Click にて、lParam = TRUE な WM_SETFONT を送出しました。
実験コードなので私は省きましたが、実際には、DeleteObject も必須でしょうね。
投稿者 alvin  (社会人) 投稿日時 2010/1/22 20:26:42
おお、変更可能であることを確認しました。

1.VISTAでも同じ動作をしていて、SysListView32であることを確認しました。
2.タイマーを利用して、カーソルがあるとこのハンドルを取得し、WM_SETFONTを送信することで
候補一覧のフォントは変更されるまで確認しました。

FindWindowExでそのハンドルを取得は失敗しています。
Spy++で確認した結果、その実態は画面の子供ではないようで、デスクトップウィンドウから検索する必要があると思います。

最後の手段としてとって置きます。

勉強になりました。
本当にありがとうございます。