いつもお世話になっております。良です。
初歩的な質問なのですがコンボボックスで
マウスのホイールでドロップダウンを禁止するには
どのプロパティを使えばよろしいでしょうか?
プロパティを見て設定してもうまく設定されなかったので
できればご教授のほうよろしくお願いいたします。
環境はVB.NET2003 WinXPです。
コンボボックスの『ドロップダウン』というと、
「F4」キーを押したり、「Alt + ↓」を押した時の動作ですよね。
当方の環境では、ホイール操作ではドロップダウンしませんでした。
マウスドライバの設定で、ホイールに何か余計な機能が割り当てられていませんか?
こんにちは良です。
>魔界の仮面弁士さん
早速お返事のほうありがとうございます!
alt+↓とF4ですとリストは表示しますが選択(コンボのテキストに選択された文字が表示)はされませんでした。
ctrl+↓ですとコンボのテキストに選択されてしまいます。
あとマウスのホイール操作をしますと選択されたものが
コンボのテキストに表示されてしまいます。
拙い説明ですみません。
セレクトチェンジイベントで勝手に検索される
ものを作ったんですがホイールで毎回選択されてしまうと
毎回検索してしまうのでそれをどうにかしたくて質問いたしました。
やっぱりマウスの設定がおかしいんでしょうか?
フォーカスを逃がしたらいいとか?
>コンボのテキストに表示されてしまいます。
本格的にやるとなると、ComboBox を『継承』した myComboBox クラスを
作成して、WndProc メソッドを『オーバーライド』して WM_MOUSEWHEEL
を握りつぶすとか、OnMouseWheel メソッドでどうにかするとかの話になり
そうです。
>フォーカスを逃がしたらいいとか?
どのタイミングか難しいかも。。。 Enter したらつねにどっかにフォーカスが
移るのも。。。かといって ComboBox1.MouseWheel イベントとかでは遅い
ような。。。その後どうするの?的な問題が。。。
お返事ありがとうございます。
>通ってみた さん
フォーカスは逃すタイミングが確かに難しかったので
うまくできませんでした。
>特攻隊長まるるうさん
ComboBox1.MouseWheel イベントは試してみたんですが
セレクトチェンジイベントが発生した後にこのイベントが
動きますので遅かったです。ですのでセレクトチェンジイベントを
やめてボタンを生成してボタンイベントに変えました。
皆さんありがとうございましたm(__)m
別解として継承クラスの簡易版を作成しました。
技術レベルは高めです。『継承』や『WndProc』についての知識が
無い方は使わないでください。
[VB6.0]時代の『フック』と同等なレベルの話です。
このままでは、WM_MOUSEWHEEL を全てブロックします。
また、処理が頻繁に発生しますので、OnMouseWheel メソッド(MouseWheel イベントとは別)
とかの利用を検討してみるべきでしょう。動作確認を十分に行わないと正常な動作を
妨げる可能性もあります。
[VB.NET]
Public Class Form1
Inherits System.Windows.Forms.Form
[省略]" Windows フォーム デザイナで生成されたコード "
Private myCombo As myComboBox
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'本来は、InitializeComponent の近辺で実行すべき処理かも?[省略]部分の説明になるので省略します。
Me.SuspendLayout()
Me.myCombo = New myComboBox
With Me.myCombo
.Name = "myCombo1"
.Text = "myCombo1"
.TabIndex = 0
.Location = New Point(12, 12)
With .Items
.Add("あああ")
.Add("いい")
.Add("うう")
.Add("え")
.Add("おおお")
End With
End With
Me.Controls.Add(Me.myCombo)
Me.ResumeLayout(False)
End Sub
'WM_MOUSEWHEEL を全てブロックするコンボボックス継承クラス
Public Class myComboBox
Inherits System.Windows.Forms.ComboBox
Private Const WM_MOUSEWHEEL As Integer = &H20A
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If m.Msg <> WM_MOUSEWHEEL Then
MyBase.WndProc(m)
End If
End Sub
End Class
End Class
こんにちは良です。
>特攻隊長まるるうさん
本当にいつもお返事ありがとうございます!
特攻隊長まるるうさんには頭が上がらないです。
本当にありがとうございますm(__)m
>特攻隊長まるるうさん
初心者ながらの質問なのですが
>'WM_MOUSEWHEEL を全てブロックする
というのはそのフォームのマウスホイール操作を
全て無効にすることですか?
このコンボだけとかコントロールを指定して
マウスホイール操作を無効にすることはできませんか?
>技術レベルは高めです。『継承』や『WndProc』についての知識が
>無い方は使わないでください。
分かってないようですね。
ボクの場合、質問者のみに回答しているわけではありません。
他の回答者や、挑戦できる実力のある人が更に知識をつけられる
オマケも提供しています。分からないのであれば実力がつくまで
利用しないのも1つの選択ですよ?
フォーム上に何もコントロールを置かない状態で(新規フォームで)
左上にスペースを空けて(コンボボックスが自動で追加されます)
スクロールできる…既存のコンボボックスを追加して Item を追加
すれば上のサンプルコードをテストできます。
既存のコンボボックスと動きが違うと思いますので確認してください。
>このコンボだけとかコントロールを指定して
>マウスホイール操作を無効にすることはできませんか?
そうなってると思います。違ったら報告してください。修正します。
>特攻隊長まるるうさん
お返事ありがとうございます。
私にはまったくわからない処理手順ですので
全部見た後、コメント部分をみて質問してしまいました。
全然わかっていないですね。すみません。
とりあえず自分の専用のサンプル集にコピペして
保存してわかるようになるまであたためておきます。
まだ私には使えないのでしばらくは眺めてみます。
本当にありがとうございました。
ツイート | ![]() |