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

TrackBarをマウスホイールでスクロールさせるとイベントが発生しない

環境/言語:[XP VB.NET 2002]
分類:[.NET]

Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll

TrackBarコントロールのValueの変化(スクロール)をこのように取得しています。
キーボードやマウスクリックでのスクロールではこれで問題ないのですが、
マウスホイールを回転させてスクロールさせるとまったく反応しません。

マウスホイールの回転でも反応させる方法、
またはマウスホイールによるスクロールを禁止する方法がありましたら、
ご教授お願いします。
ValueChangedで代用しちゃだめ?
さっそくのアドバイスありがとうございます。しかし、残念ながら、

Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll

この部分を

Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.ValueChanged

このように書き換えてみましたが、現象はまったく変わりませんでした。
通常のスクロールでは問題ありませんが、やはりホイールでのスクロールのみ反応しません。
ホイールマウスはどこのどんな製品で、ドライバはどうしていますか?

ホイールによるスクロールって、↑の組み合わせによって意外とバラバラだったりしますよ。
ホイールにせよ何にせよ、値が変わったのにValueChangedイベントが起こらないとすれば、ひどい話ですね。

TrackBarにもMouseWheelイベントはありますので、試してみてはいかがでしょうか。

ホイールによるスクロールを防止するには、TrackBarのOnMouseWheelメソッドをオーバーライドし、何もしないようにするという方法があります。(MouseWheelイベントが起こらないようなら、無駄ですが。)
■No14391に返信(渋木宏明(ひどり)さんの記事)
> ホイールマウスはどこのどんな製品で、ドライバはどうしていますか?
>
> ホイールによるスクロールって、↑の組み合わせによって意外とバラバラだったりしますよ。

http://www.microsoft.com/japan/hardware/mouse/basic_optical.asp
パッケージが残っていないので確実ではありませんが、
見た目やスペックから、おそらく使用中のマウスはこれだと思います。

同じマウスが使用されているPCをたくさん見たことがあるので、
特に特殊なマウスという訳でもなく、
比較的広く普及している一般的なマウスであると思います。

今回の問題以外、普段の使用ではまったく問題はないため、
特にドライバをインストールしたりはしていません。

USB対応ですが、付属の変換アダプタでPS/2に変換し、
デスクトップPC本体のPS/2ポートに接続して使用しています。
■No14400に返信(管理人さんの記事)
> ホイールにせよ何にせよ、値が変わったのにValueChangedイベントが起こらないとすれば、ひどい話ですね。

ここまでのみなさんの文面を見ていると、
この現象が発生しているのは私だけで、
一般的には発生しないということなのでしょうか。

> TrackBarにもMouseWheelイベントはありますので、試してみてはいかがでしょうか。

Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.ValueChanged

この部分を

Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TrackBar1.MouseWheel

このように書き換えてみました。
すると、ホイール回転でのスクロールのときにだけ反応するようになりました。

そこで、クリックでのスクロールでも反応するよう、

Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TrackBar1.MouseWheel, TrackBar1.MouseUp

としてみました。
これで一応クリックでのスクロールでも反応するようにはなりましたが、
クリックしてスクロールしているとき、
MouseUpだとボタンを離すまでイベントが発生しないので動きが不自然になってしまいます。
あと、これだとキーボードでスクロールしたときに反応しません。

そこで、MouseWheelとValueChangedを両方Handlesに書けば解決すると思うのですが、
MouseWheelはSystem.Windows.Forms.MouseEventArgs、
ValueChangedはSystem.EventArgsなのでうまく行きません。

VB.NETの基本的な質問になってしまうかもしれませんが、
ByVal e Asの後ろに両方を書く方法はないでしょうか。
> ここまでのみなさんの文面を見ていると、
> この現象が発生しているのは私だけで、
> 一般的には発生しないということなのでしょうか。

私のところでは発生しませんでしたが、調べてみたところ、このような問題が確かにあるようです。

> VB.NETの基本的な質問になってしまうかもしれませんが、
> ByVal e Asの後ろに両方を書く方法はないでしょうか。

TrackBarを継承した新たなクラスを作る方法があります。このクラスでOnMouseWheelメソッドをオーバーライドし、OnValueChangedメソッドを呼び出すようにすれば、ValueChangedイベントが発生するようになるでしょう。

そこまでしなくても、MouseWheelイベントハンドラでTrackBarの値が変わったときに呼び出すべきメソッドを呼び出せば済むかもしれませんが。
■No14420に返信(管理人さんの記事)
> 私のところでは発生しませんでしたが、調べてみたところ、このような問題が確かにあるようです。

わざわざお調べいただきありがとうございます。
もしかしたら、2002だけの問題で、2003や2005では発生しないのかもしれません。
2003では発生しないのに2002だと発生するといったバグは今までにも多々ありましたし。

MouseWheelイベントが発生したときにValueを表示してみたところ、値は変化していました。
それなのになぜValueChangedイベントが発生しないのか、本当に不思議です。

> TrackBarを継承した新たなクラスを作る方法があります。このクラスでOnMouseWheelメソッドをオーバーライドし、OnValueChangedメソッドを呼び出すようにすれば、ValueChangedイベントが発生するようになるでしょう。
>
> そこまでしなくても、MouseWheelイベントハンドラでTrackBarの値が変わったときに呼び出すべきメソッドを呼び出せば済むかもしれませんが。

結局、ValueChangedとMouseWheelの2つのイベントハンドラから同じSubを呼び出すことで解決しました。
ありがとうございました。
解決済み!

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