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

TrackBarのマウスホイール移動量変更

環境/言語:[WindowsXP C# 3.5SP1]
分類:[.NET]

こんにちは。

C#でWindowsアプリを作成しています。

TrackBarをマウスホイールで操作した場合の移動量を1ずつに
変更したいのですが思うようにできません。

SmallChange、LargeChangeを1にしても、それより大きな単位
で動作します。

それならば、TrackBarをカスタムしOnMouseWheelでValueを
1ずつ変更してやればと思ったのですが、下記のように記述
するだけでなぜか1ずつになりました。

protected override void OnMouseWheel(MouseEventArgs e)
{
Console.WriteLine(this.Value);
this.OnScroll(new EventArgs());
}

しかし、Console.WriteLine(this.Value)で値を確認すると
以下のようにValueが変更される前に来ているようです。

1回目のホイール操作で1つ上げた場合 →this.Valueは変化しない
2回目のホイール操作でさらに1つ上げた場合→this.Valueは前回の+1の変化
3回目のホイール操作でさらに1つ上げた場合→this.Valueは前回の+1の変化
最大までトラックを上げた場合 →this.ValueはMaximun - 1の値
最大までトラックを上げた後一つ下げた場合 →this.ValueはMaximunの値

マウスホイールで操作した場合の移動量を1ずつに変更する
にはどうしたらよいのでしょうか。
ご指導よろしくお願いします。
OnScrollを呼ぶのではなく、直接Valueを操作したらどうでしょうか?
■No30071に返信(Hongliangさんの記事)
> OnScrollを呼ぶのではなく、直接Valueを操作したらどうでしょうか?

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

以下のようにOnScrollを呼ばなくてもValueの値が変わってしまう状態です。
フォーム上で受け取ったTrackBarのOnScrollイベント内で画像の拡縮を行っ
ているのですが、以下の記述のみですとOnScrollが呼ばれないため記述して
いました。

protected override void OnMouseWheel(MouseEventArgs e)
{
Console.WriteLine(this.Value);
}

試しにWndProc内でマウスホイールをつかまえてValueを操作したところ
こちらでは思うような動作となりました。
お騒がせしてしまい申し訳ありませんでした。

const int MOUSEWHEEL = 0x20A;
protected override void WndProc(ref Message m)
{
if (m.Msg == MOUSEWHEEL)
{
int d = m.WParam.ToInt32();
if (d < 0)
{
int v = this.Value - this.SmallChange;
if (this.Minimum > v) v = this.Minimum;
this.Value = v;
}
else if (d > 0)
{
int v = this.Value + this.SmallChange;
if (this.Maximum < v) v = this.Maximum;
this.Value = v;
}
Console.WriteLine(this.Value);
this.OnScroll(new EventArgs());
return;
}
base.WndProc(ref m);
}
解決済み!

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