コンボボックスのイベントについて

解決


るーちゃん  2007-04-03 20:55:43  No: 143510

こんにちは。
るーちゃんです。
久しぶりに質問いたします。

最近になってようやくVB.netに手をつけ始めています。
環境は
VB2003(WindowsApplicationで画面を作成)
Windows2000です。

質問は以下になります。
コンボボックスには、DropDownというイベントがあります
よね。リスト部分が展開されると発生するイベントですが、
これの逆、リストが畳まれると発生するイベントは無さそう
ですが、畳まれたことを調べる方法はあるのでしょうか。

上記の質問に至った経緯は次のとおりです。

コンボボックスにフォーカスがあり、リストが展開されている
状態で、他のコントロールにフォーカスを移そうと、マウスを
使った時は、すぐには対象コントロールに移動せず、まずコンボ
ボックスのリストが畳まれるだけで、特にフォーカス移動は
発生しません。これを他のコントロールにすぐ移動できるように
したいのです(畳まれた時にマウスの座標が自身の上にいない
場合は、その位置にいる他のコントロールにフォーカスを移す)。


るーちゃん  2007-04-04 06:07:01  No: 143511

解決したわけではありませんが。。。

GetComboBoxInfoと、MouseEnterイベントを
駆使すると解決できるような気がしています。
もう少し調べてみます。


魔界の仮面弁士  2007-04-04 08:48:08  No: 143512

> コンボボックスには、DropDownというイベントがありますよね。
現行バージョンには、DropDownClosed イベントもありますよ。
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.combobox.dropdownclosed(VS.80).aspx

> 畳まれたことを調べる方法はあるのでしょうか。
.NET 1.1 だと、ComboBox の WndProc メソッドをオーバーライドして
捉えるしか無いかも知れません。

手元に VB.NET 2003 が無いので、メモ帳 + 手動コンパイルでの
動作検証ですが、以下のコードにて、.NET 1.1 で判定できました。
http://www.vb-user.net/junk/200704032345/DropDownClosed.txt


るーちゃん  2007-04-04 19:04:30  No: 143513

いつもお世話になっております。

勉強がまだ至っていなくて、ControlクラスにWndProcが
あることに気が付きませんでした。
簡単にメッセージフックが使えるのですね。
&H2111が何なのかは調べてみます。

※これでしたら、なんとか出来そうです。解決したと
  させてください。

フレームワークの2.0にはDropDownClosedというのが存在するのですね。
(ちょっとプロジェクト的にOKなのか確認はしてみますが恐らく2.0は不可
かも)
書き忘れていました。使用しているのはフレームワークは1.1です。

余談ですが、上記の環境はある開発プロジェクトの
規定された環境になっていて、VB2003にGrapeCityのPowerToolsも
いっしょに使っています。このPowerToolsって(トライアル版なの
ですが)日数が経つと、PowerToolsのトライアル版確認ダイアログの
OKボタンがすぐには押せなくなります。面倒くさいから再インストール
するのですが、せっかく自分で新規作成した.net上のツールバーが見事に
消えてしまいました。唖然というかショック。orz


魔界の仮面弁士  2007-04-05 02:48:30  No: 143514

> &H2111が何なのかは調べてみます。
すみません。手を抜かずに Const にすべきでしたね。

ネタばらしをすると、&H2111 が OCM_COMMAND で、
HIWORD の 8 の方は CBN_CLOSEUP です。
先の URL のソースの方も直しておきます。

> (ちょっとプロジェクト的にOKなのか確認はしてみますが恐らく2.0は不可かも)
> 書き忘れていました。使用しているのはフレームワークは1.1です。
まぁ、改めて書くまでもなく、VB.NET 2003 である以上、.NET Framework 1.1 が必須ですし。

で、Visual Basic で .NET Framework 2.0 対応のアプリを書くとなると、
VB.NET 2003 (VB7.1) は使えないので、どうしても VB2005 (VB8) が必要となります。
ですから、今回の案件では不可だと思いますよ。

> 日数が経つと、PowerToolsのトライアル版確認ダイアログの
> OKボタンがすぐには押せなくなります。面倒くさいから再インストール
そのような発言を見ると、VB にしても PowerTools にしても、きちんと必要分の
ライセンスを購入してあるのかどうか、ものすごく心配になってしまいます…。
(VB は 開発者の人数分、最近の PowerTools は PC の台数分のライセンスが必要なはず)

PowerTools シリーズのどの製品を利用されているのかわかりませんが、PowerTools の
トライアル版って、それぞれの製品ごとに試用期間が定められていましたよね。
  (インストール後から 30日間のものとか、60日間のものとか)
もし、それを超えて(再インストールするなどして)試用し続けているのだとしたら、
使用許諾契約違反になってしまうかと思いますが、その点は大丈夫でしょうか?


るーちゃん  2007-04-05 04:14:31  No: 143515

>OCM_COMMAND
そういう名称があったのですね。
Spy++で見てたのですが、WM_USER+値で出てました(^^

>使用許諾契約違反
うーん。派遣で来てますからねぇ。問題があっても申し添え
するくらいしかできません。。
(製品版は、最終的に検証・納品作業を行う人のマシンに
1セットのみある状態です)

あ、それでですね、コンボボックスの件ですが、
条件付で動作確認できました。
条件とは、コンボボックスと、コンボボックス以外のコントロール間
でしたら、やりたいことが出来ています。リストを閉じてから他の
コントロールへフォーカスが移ります。
ただ、コンボボックス同士でフォーカス移動をすると、2度目に
かならずリストの展開が出来なくなります。どうやらリスト部分(と考えて
います)のマウスキャプチャが外れないのが原因とは思うのですけど、なぜか
外れなくなります。この辺りは今調べ中です。ReleaseCaptureだけでは
駄目なのでしょうか?

このコンボボックスですが、客先の要望により、エディット部分をクリック
した場合でもリスト展開するようになっているのです。
GotFocusのタイミングでMe.DroppedDown = Trueとしています。


るーちゃん  2007-04-05 05:38:43  No: 143516

解決してしまいました。

キャプチャしている対象がいない場合の
対応が入っていなかっただけのようです。

・WM_CAPTURECHANGEDを受信したときに、
    →m.LParam.ToInt32が0以外であればReleaseCapture()を
      行って、MyBase.WndProc(m)を呼ばない。
    →m.LParam.ToInt32が0のときで、OCM_COMMANDを既に受信
      しており、そのwParamが&h7(CBN_DROPDOWN)のときは
      そのドロップダウン時のGetCaptureしておいた値を使って
      SetCaptureする。MyBase.WndProc(m)を呼ぶ。
    →m.LParam.ToInt32が0のときで、OCM_COMMANDを既に受信
      しており、そのwParamが&h7(CBN_DROPDOWN)のときで、
      そのドロップダウン時のGetCaptureしておいた値も0のときは
      一旦ReleaseCapture()してから、Me.Handle.ToInt32を使って
      SetCaptureする。MyBase.WndProc(m)は呼ばない。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加