こんにちは。
るーちゃんです。
久しぶりに質問いたします。
最近になってようやくVB.netに手をつけ始めています。
環境は
VB2003(WindowsApplicationで画面を作成)
Windows2000です。
質問は以下になります。
コンボボックスには、DropDownというイベントがあります
よね。リスト部分が展開されると発生するイベントですが、
これの逆、リストが畳まれると発生するイベントは無さそう
ですが、畳まれたことを調べる方法はあるのでしょうか。
上記の質問に至った経緯は次のとおりです。
コンボボックスにフォーカスがあり、リストが展開されている
状態で、他のコントロールにフォーカスを移そうと、マウスを
使った時は、すぐには対象コントロールに移動せず、まずコンボ
ボックスのリストが畳まれるだけで、特にフォーカス移動は
発生しません。これを他のコントロールにすぐ移動できるように
したいのです(畳まれた時にマウスの座標が自身の上にいない
場合は、その位置にいる他のコントロールにフォーカスを移す)。
解決したわけではありませんが。。。
GetComboBoxInfoと、MouseEnterイベントを
駆使すると解決できるような気がしています。
もう少し調べてみます。
> コンボボックスには、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
いつもお世話になっております。
勉強がまだ至っていなくて、ControlクラスにWndProcが
あることに気が付きませんでした。
簡単にメッセージフックが使えるのですね。
&H2111が何なのかは調べてみます。
※これでしたら、なんとか出来そうです。解決したと
させてください。
フレームワークの2.0にはDropDownClosedというのが存在するのですね。
(ちょっとプロジェクト的にOKなのか確認はしてみますが恐らく2.0は不可
かも)
書き忘れていました。使用しているのはフレームワークは1.1です。
余談ですが、上記の環境はある開発プロジェクトの
規定された環境になっていて、VB2003にGrapeCityのPowerToolsも
いっしょに使っています。このPowerToolsって(トライアル版なの
ですが)日数が経つと、PowerToolsのトライアル版確認ダイアログの
OKボタンがすぐには押せなくなります。面倒くさいから再インストール
するのですが、せっかく自分で新規作成した.net上のツールバーが見事に
消えてしまいました。唖然というかショック。orz
> &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日間のものとか)
もし、それを超えて(再インストールするなどして)試用し続けているのだとしたら、
使用許諾契約違反になってしまうかと思いますが、その点は大丈夫でしょうか?
>OCM_COMMAND
そういう名称があったのですね。
Spy++で見てたのですが、WM_USER+値で出てました(^^
>使用許諾契約違反
うーん。派遣で来てますからねぇ。問題があっても申し添え
するくらいしかできません。。
(製品版は、最終的に検証・納品作業を行う人のマシンに
1セットのみある状態です)
あ、それでですね、コンボボックスの件ですが、
条件付で動作確認できました。
条件とは、コンボボックスと、コンボボックス以外のコントロール間
でしたら、やりたいことが出来ています。リストを閉じてから他の
コントロールへフォーカスが移ります。
ただ、コンボボックス同士でフォーカス移動をすると、2度目に
かならずリストの展開が出来なくなります。どうやらリスト部分(と考えて
います)のマウスキャプチャが外れないのが原因とは思うのですけど、なぜか
外れなくなります。この辺りは今調べ中です。ReleaseCaptureだけでは
駄目なのでしょうか?
このコンボボックスですが、客先の要望により、エディット部分をクリック
した場合でもリスト展開するようになっているのです。
GotFocusのタイミングでMe.DroppedDown = Trueとしています。
解決してしまいました。
キャプチャしている対象がいない場合の
対応が入っていなかっただけのようです。
・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)は呼ばない。
ツイート | ![]() |