コンボボックスのマウスホイールでドロップダウンするのを無効にするには?

解決


  2006-06-30 19:40:18  No: 132105

いつもお世話になっております。良です。
初歩的な質問なのですがコンボボックスで
マウスのホイールでドロップダウンを禁止するには
どのプロパティを使えばよろしいでしょうか?
プロパティを見て設定してもうまく設定されなかったので
できればご教授のほうよろしくお願いいたします。

環境はVB.NET2003 WinXPです。


魔界の仮面弁士  2006-06-30 20:08:07  No: 132106

コンボボックスの『ドロップダウン』というと、
「F4」キーを押したり、「Alt + ↓」を押した時の動作ですよね。

当方の環境では、ホイール操作ではドロップダウンしませんでした。
マウスドライバの設定で、ホイールに何か余計な機能が割り当てられていませんか?


  2006-06-30 20:21:54  No: 132107

こんにちは良です。

>魔界の仮面弁士さん

早速お返事のほうありがとうございます!
alt+↓とF4ですとリストは表示しますが選択(コンボのテキストに選択された文字が表示)はされませんでした。
ctrl+↓ですとコンボのテキストに選択されてしまいます。
あとマウスのホイール操作をしますと選択されたものが
コンボのテキストに表示されてしまいます。

拙い説明ですみません。

セレクトチェンジイベントで勝手に検索される
ものを作ったんですがホイールで毎回選択されてしまうと
毎回検索してしまうのでそれをどうにかしたくて質問いたしました。

やっぱりマウスの設定がおかしいんでしょうか?


通ってみた  2006-06-30 20:40:30  No: 132108

フォーカスを逃がしたらいいとか?


特攻隊長まるるう  2006-06-30 20:54:59  No: 132109

>コンボのテキストに表示されてしまいます。
本格的にやるとなると、ComboBox を『継承』した myComboBox クラスを
作成して、WndProc メソッドを『オーバーライド』して WM_MOUSEWHEEL
を握りつぶすとか、OnMouseWheel メソッドでどうにかするとかの話になり
そうです。

>フォーカスを逃がしたらいいとか?
どのタイミングか難しいかも。。。 Enter したらつねにどっかにフォーカスが
移るのも。。。かといって ComboBox1.MouseWheel イベントとかでは遅い
ような。。。その後どうするの?的な問題が。。。


  2006-06-30 21:08:02  No: 132110

お返事ありがとうございます。

>通ってみた  さん

フォーカスは逃すタイミングが確かに難しかったので
うまくできませんでした。

>特攻隊長まるるうさん
ComboBox1.MouseWheel イベントは試してみたんですが
セレクトチェンジイベントが発生した後にこのイベントが
動きますので遅かったです。ですのでセレクトチェンジイベントを
やめてボタンを生成してボタンイベントに変えました。

皆さんありがとうございましたm(__)m


特攻隊長まるるう  2006-07-01 00:31:48  No: 132111

別解として継承クラスの簡易版を作成しました。
技術レベルは高めです。『継承』や『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


  2006-07-01 01:19:27  No: 132112

こんにちは良です。

>特攻隊長まるるうさん

本当にいつもお返事ありがとうございます!

特攻隊長まるるうさんには頭が上がらないです。
本当にありがとうございますm(__)m


  2006-07-01 01:22:12  No: 132113

>特攻隊長まるるうさん

初心者ながらの質問なのですが

>'WM_MOUSEWHEEL を全てブロックする

というのはそのフォームのマウスホイール操作を
全て無効にすることですか?

このコンボだけとかコントロールを指定して
マウスホイール操作を無効にすることはできませんか?


特攻隊長まるるう  2006-07-01 01:54:12  No: 132114

>技術レベルは高めです。『継承』や『WndProc』についての知識が
>無い方は使わないでください。
分かってないようですね。

ボクの場合、質問者のみに回答しているわけではありません。
他の回答者や、挑戦できる実力のある人が更に知識をつけられる
オマケも提供しています。分からないのであれば実力がつくまで
利用しないのも1つの選択ですよ?

フォーム上に何もコントロールを置かない状態で(新規フォームで)
左上にスペースを空けて(コンボボックスが自動で追加されます)
スクロールできる…既存のコンボボックスを追加して Item を追加
すれば上のサンプルコードをテストできます。

既存のコンボボックスと動きが違うと思いますので確認してください。
>このコンボだけとかコントロールを指定して
>マウスホイール操作を無効にすることはできませんか?
そうなってると思います。違ったら報告してください。修正します。


  2006-07-01 02:10:56  No: 132115

>特攻隊長まるるうさん

お返事ありがとうございます。
私にはまったくわからない処理手順ですので
全部見た後、コメント部分をみて質問してしまいました。
全然わかっていないですね。すみません。
とりあえず自分の専用のサンプル集にコピペして
保存してわかるようになるまであたためておきます。

まだ私には使えないのでしばらくは眺めてみます。
本当にありがとうございました。


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

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






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