- PR -

マウスホイールによるパネルのスクロールを抑止

1
投稿者投稿内容
にし
会議室デビュー日: 2002/06/18
投稿数: 18
お住まい・勤務地: 東京都
投稿日時: 2005-05-16 21:20
【環境】
.NET Framework1.0 SP2
Windows 2000 Pro

【相談内容】
・Windows フォームに、パネルが含まれる。
・パネルには、データグリッドが含まれる。
・データグリッドはパネルの幅より広い。
・パネルの AutoScroll プロパティは true で、水平スクロールバーが表示される。
・データグリッドには多くのレコードがあり、垂直スクロールバーが表示される。
・パネルには垂直スクロールバーはない。
・データグリッドには水平スクロールバーはない。

上記の条件でフォーカスがデータグリッドにあるとき、マウスホイールを動かすと、パネルの水平スクロールバーとデータグリッドの垂直スクロールバーが動いてしまいます。
データグリッドの垂直スクロールバーのみが動くようにするにはどうすればよいでしょうか。

よろしくお願いします。

[ メッセージ編集済み 編集者: にし 編集日時 2005-05-17 11:01 ]
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-05-17 11:50
動作確認したわけじゃないし、いまひとつスマートじゃないけど・・・
WndProcでWM_MOUSEEHEELメッセージを握り潰すとか。
_________________
甕星 <mikahosi@abox9.so-net.ne.jp>
http://blogs.msmvp.jp/mikahosi/
にし
会議室デビュー日: 2002/06/18
投稿数: 18
お住まい・勤務地: 東京都
投稿日時: 2005-05-17 13:05
引用:

甕星さんの書き込み (2005-05-17 11:50) より:
動作確認したわけじゃないし、いまひとつスマートじゃないけど・・・
WndProcでWM_MOUSEEHEELメッセージを握り潰すとか。



私もまだ確認していませんが、これだと縦スクロールも無効になるような気がします。。。
にし
会議室デビュー日: 2002/06/18
投稿数: 18
お住まい・勤務地: 東京都
投稿日時: 2005-05-18 19:56
引用:

甕星さんの書き込み (2005-05-17 11:50) より:
動作確認したわけじゃないし、いまひとつスマートじゃないけど・・・
WndProcでWM_MOUSEEHEELメッセージを握り潰すとか。



実際に書き始めて基本的なことがわかっていないことに気がつきました。
WndProc で WM_MOUSEWHEEL を引っ掛け、スルー(無視)すればよいのですよね?たぶん。
そもそも、WndProc メソッド内で、WM_MOUSEWHEEL を判定する方法がわかりません。
引数 m でどう判定していいものやら。

お手数おかけしますが、解説よろしくおねがいします。

[ メッセージ編集済み 編集者: にし 編集日時 2005-05-18 19:57 ]
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-05-19 07:33
下のような感じで処理できると思いますけど。
コード:
class Class1 : Panel
{
    protected override void WndProc(ref Message m)
    {
        Console.WriteLine("Event = {0}", m.Msg);
        if (m.Msg == 0x020A)
        {
            Console.WriteLine("Mouse Wheel");
        }
        else
        {
            base.WndProc(ref m);
        }
    }
}


にし
会議室デビュー日: 2002/06/18
投稿数: 18
お住まい・勤務地: 東京都
投稿日時: 2005-05-19 10:25
甕星さん、ありがとうございました。
できました。
動きとしては、OnMouseWheelメソッドをオーバーライドして、base.OnMouseWheel を実行しない方法と同じでした。

下記の方法で作成することにしました。

・水平スクロールバーはパネルのものを使用
・垂直スクロールバーはパネルの外に作成
・パネルの WndProc で WM_MOUSEWHEEL をスルー または、OnMouseWheelをオーバーライドして中身を空。(WndProcでは頻繁に処理が走るので後者のほうが良いかな)

パネル内でマウスホイールを動かすと、アクティブセルが可視となるよう、勝手に水平スクロールしてしまいます。
これは妥当な動作だと考えます。
(もともとの現象は可視目的ではなく、無条件に水平スクロールバーをスクロールさせる動きでした。)
しかし、垂直スクロールバーが常に表示されていますので、これを使用すればアクティブセルにかかわらず、単純に垂直スクロールのみ行います。

アドバイスいただき、ありがとうございました。

[ メッセージ編集済み 編集者: にし 編集日時 2005-05-19 18:27 ]
1

スキルアップ/キャリアアップ(JOB@IT)