DOBON.NET DOBON.NETプログラミング掲示板過去ログ

マウスWheelのイベントについて

環境/言語:[Windows2000SP4 C# .NET Framework1.1]
分類:[.NET]

いつも参考にさせていただいています。

現在C#で画面を作成しているのですが

親画面をDlgMainとして
そこから呼ばれるDlgWindowAに
コンボボックスCmbA, CmbB, CmbC
その他テキストボックス等を複数配置

上記のような条件でコンボボックスのCmbAとCmbBにだけ
マウスWheelのイベントを無視させたい
(Wheelで選択アイテムを変更させたくない)
のですが、方法はあるでしょうか?

どうかよろしくお願いします。
こんにちは、じゃんぬ です。

■No11303に返信(ぴっぴさんの記事)
> 上記のような条件でコンボボックスのCmbAとCmbBにだけ
> マウスWheelのイベントを無視させたい
> (Wheelで選択アイテムを変更させたくない)
> のですが、方法はあるでしょうか?

WndProc をオーバーライドして WM_MOUSEWHEEL を捕捉、
ActiveControl が、CmbA, CmbB であれば排除。
といった具合でしょうか。
じゃんぬさん ご教授ありがとうございます。

> WndProc をオーバーライドして WM_MOUSEWHEEL を捕捉、
> ActiveControl が、CmbA, CmbB であれば排除。
> といった具合でしょうか。

早速下記のようにWndProcのオーバーライド処理を入れてみたのですが
上手く動作してくれません。

protected override void WndProc(ref Message m) {
    const int WM_MOUSEWHEEL = 0x20A;

    if((this.ActiveControl == CmbA) ||
       (this.ActiveControl == CmbB)) {
        if(m.Msg == WM_MOUSEWHEEL) {
            m.Result = IntPtr.Zero;
        } else {
            base.WndProc(ref m);
        }

    } else {
        base.WndProc(ref m);
    }
}

何処が悪いのかご指摘頂けると助かります。
よろしくお願いします。
こんにちは、じゃんぬ です。

■No11361に返信(ぴっぴさんの記事)
> 早速下記のようにWndProcのオーバーライド処理を入れてみたのですが
> 上手く動作してくれません。

失礼しました、どうやら ComboBox 内でしか捕捉できないみたいです。
ComboBox の派生クラスを作って、WndProc をオーバーライドすると解決します。
> 失礼しました、どうやら ComboBox 内でしか捕捉できないみたいです。
> ComboBox の派生クラスを作って、WndProc をオーバーライドすると解決します。
ご教授していただいた通りにした結果、無事に動作しました。

じゃんぬさん、どうもありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板