0

マウスホイールの検知 (C#)

Posted by Koumei on 2011年1月30日 in Windowsプログラミング |

 マウスホイールを受け取ってくれるコントロールならいいのだが、受け取ってくれなくてもマウスホイールを検知したい。
 簡単に言うと、あるコントロールがマウスホイールでスクロールしてくれなかったので何とかしたいということである。
 古いバージョンのFlexGridだからだが、それを使うように指定されたら仕方ない。
 「仕様です」で逃げたくないし。

 実はこれが簡単だったりする。

 やりたいことは、マウスがそのコントロール内に入ったら、ホイールでスクロールするということである。
 クリックしなくても、だ。
 ブラウザのパーツはそうなっているので、それに合わせたい。

 まず、マウスホイールの値をどうやって受け取るかだが、これには隠れイベントを有効化することで対応する。
 マウスホイールの変化は、イベントとして存在しているが、プロパティーのイベントとしては表示されていないのである。

    InitializeComponent();の中、もしくはその直後に記述する。

    this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.イベント名);

 
 値を取得したいコントロール内にマウスカーソルが入ったら、そのコントロールにフォーカスさせる。
 フォーカスのあるコントロールにしかイベントが起きないのである。
 これは丁度いい。
 MouseEnterイベントでthis.Focus()するだけだ。
 必要ならMouseLeaveで別にフォーカスを移してもいいが、通常はしない方がいいだろう。
 

 イベント内では、「System.Windows.Forms.MouseEventArgs e.Delta」を使う。
 どのくらい動かすかによるが、120で1とカウントするといい。
 カチっとなると120(または-120)で、カチカチとなると240(または-240)になるのである。
 カチで3行動かすなら、40で割ればいい。

 で、スクロールの変移なので、上に行くのにマイナス、下に行くのにプラスがいい。
 が、受け取った値はプラス・マイナスが逆である。
 符号を反転させて加算するか、そのまま減算するかというだけだが、好きな方にすればいいだろう。

ホイール値は、上記「イベント名」内で受け取る。
    private void イベント名(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        int Wheel = (e.Delta / 120);
        //ここで何らかの処理
    }

 
 これで、通常はできないような処理(ホイールでズームするとか)だってできるようになる。

 
 追記
 どうやら使っていたものをアップデート(無償)してやるとマウスホイールにも対応しているようである。
 ただし、フォーカスがある場合だけなのは同じで、カーソルが入ったらフォーカスしなければならない。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

キャプチャ *

Copyright © 2009-2020 Koumei Soft 開発ログ All rights reserved.
This site is using the Desk Mess Mirrored theme, v2.5, from BuyNowShop.com.