C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: AutoScrollによるスクロールバーを制御したい


(過去ログ 134 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■78953 / inTopicNo.1)  AutoScrollによるスクロールバーを制御したい
  
□投稿者/ パン (1回)-(2016/02/25(Thu) 21:42:49)

分類:[.NET 全般] 

Visual Studio 2013でVisual Basic 2013を用いてWindowsフォームアプリケーションを開発しております。
C#での回答でも構いません。

フォーム上に配置したSplitContainer1のPanel1のAutoScrollプロパティをTrueにし、中にPictureBoxを配置しています。
フォーム上でマウスホイールを回したとき同時にCtrlキーが押されていたら、画像を拡大縮小、すなわちPictureBoxのSizeを大きくしたり小さくしたりするために、フォームのMouseWheelイベントハンドラ内で、My.Computer.Keyboard.CtrlKeyDownによりCtrlキーが押されているかを判定し、その中でPictureBoxのSizeを変更する処理を書いています。

Panel1の外でCtrlキー+マウスホイール回転をすると、問題なく拡大縮小するのですが、Panel1の内部(PictureBox上でも)で同様に操作すると、PictureBoxの大きさがPanel1より大きくなりAutoScrollプロパティによってスクロールバーが表示されたタイミングで、拡大縮小できなくなってしまいます。というのも、Panel1のスクロールが優先され、フォーム側のMouseWheelイベントが発生しないのです。つまり、Ctrlキーを押していようがいまいが、AutoScrollプロパティによるスクロールバーのスクロールしか行われません。

求めている仕様は、マウスホイールが回転したとき、
・Ctrlキーが押されているときは、AutoScrollプロパティによるスクロールバーが表示されているいないに関わらず、スクロールをせずPictureBoxのサイズを変更する
・Ctrlキーが押されていないときは、AutoScrollプロパティによるスクロールバーが表示されているときだけ、通常のスクロール動作をする
というものです。

いろいろなページを調べ回り、Windowsメッセージを使って制御する方法など試してみたのですが、AutoScrollプロパティによって表示されているスクロールバーのスクロール検知が思うように行かず、苦戦しています。

AutoScrollプロパティによるスクロールバーの制御方法、お分かりの方がいらっしゃいましたらご教示願います。
引用返信 編集キー/
■78957 / inTopicNo.2)  Re[1]: AutoScrollによるスクロールバーを制御したい
□投稿者/ ぶなっぷ (73回)-(2016/02/26(Fri) 09:18:53)
トンネルイベントに切り替えたらどうですか?

要するに、MouseWheel → PreviewMouseWheel ですね。

引用返信 編集キー/
■78965 / inTopicNo.3)  Re[2]: AutoScrollによるスクロールバーを制御したい
□投稿者/ パン (2回)-(2016/02/26(Fri) 12:38:54)
No78957 (ぶなっぷ さん) に返信
> トンネルイベントに切り替えたらどうですか?
>
> 要するに、MouseWheel → PreviewMouseWheel ですね。

回答ありがとうございます。

トンネルイベント、PreviewMouseWheelイベントについて全く知らなかったのでGoogleで検索してみたのですが、WPFに関するページばかりなので、WPFアプリケーション特有のものではないかなと思いました。
Windowsフォームアプリケーションを開発しているので、該当するイベントが存在しません。

よろしくお願いいたします。
引用返信 編集キー/
■78966 / inTopicNo.4)  Re[3]: AutoScrollによるスクロールバーを制御したい
□投稿者/ ito (15回)-(2016/02/26(Fri) 13:09:53)
No78965 (パン さん) に返信
(1)PictureBoxを継承したカスタムコントロールクラスを作成
(2)フォーム内のPictureBoxをカスタムコントロールに置き換え
(3)カスタムコントロール内でWndProcをoverride
(4)WndProc内でWM_MOUSEWHEELメッセージを処理
でいけそうな気がします。

引用返信 編集キー/
■78967 / inTopicNo.5)  Re[3]: AutoScrollによるスクロールバーを制御したい
□投稿者/ ぶなっぷ (74回)-(2016/02/26(Fri) 13:23:18)
失礼しました。

私自身、仕事はWPFで、Windowsフォームは趣味程度にしかやったことがありま
せん。

「Windowsフォーム トンネルイベント Preview」
でネット検索して出てきたんで、Windowsフォームでもあるものと勘違いして
しまいました。
検索結果を見ると、確かにWPFばかりですね(^^;)

引用返信 編集キー/
■78968 / inTopicNo.6)  Re[4]: AutoScrollによるスクロールバーを制御したい
□投稿者/ ぶなっぷ (75回)-(2016/02/26(Fri) 13:32:39)
Windowsフォームでは、WPFでいうところのバブルイベントしか
ないのだとすると、子ウィンドウ(Panel1, PictureBox)にイベントを食われて
しまっているのが原因だと思います。

Panel1やPictureBoxに届いたMouseWheelのメッセージをフォーム側に転送して
はどうでしょうか?

具体的なやり方は、WPFなら分かるのですが、
Windowsフォームだと分かりませんので、識者の方々にお任せします。

引用返信 編集キー/
■78969 / inTopicNo.7)  Re[4]: AutoScrollによるスクロールバーを制御したい
□投稿者/ パン (3回)-(2016/02/26(Fri) 13:49:09)
No78966 (ito さん) に返信
> (1)PictureBoxを継承したカスタムコントロールクラスを作成
> (2)フォーム内のPictureBoxをカスタムコントロールに置き換え
> (3)カスタムコントロール内でWndProcをoverride
> (4)WndProc内でWM_MOUSEWHEELメッセージを処理
> でいけそうな気がします。

回答ありがとうございます。

PictureBoxを継承したカスタムコントロールを作成し、WndProc内でWM_MOUSEWHEELメッセージの処理を試みましたが、やはりSplitContainer1.Panel1のAutoScrollプロパティによるスクロールバーのスクロールが優先され、スクロールバーが表示されている状態でスクロールしてもカスタムコントロールにWM_MOUSEWHEELメッセージが届かないようです。

と返信しようとしたところだったのですが、フォームのMouseWheelイベントハンドラにカスタムコントロールのMouseWheelイベントをハンドルしたところ、スクロールバーが表示された状態でも拡大縮小ができるようになりました。
ただ、Ctrlキーを押しているいないに関わらずPanel1のスクロールが行われてしまいます。
つまり垂直スクロールバーが表示された状態でCtrlキーを押しながらマウスホイールを手前に引くと、縮小はするもののスクロールバーも下へ動いてしまうということです。

Ctrlキーを押しているときだけAutoScrollによるスクロールバーをマウスホイールによってスクロールしないようにする方法はありませんでしょうか。
よろしくお願いいたします。
引用返信 編集キー/
■78970 / inTopicNo.8)  Re[5]: AutoScrollによるスクロールバーを制御したい
□投稿者/ パン (4回)-(2016/02/26(Fri) 13:53:29)
No78968 (ぶなっぷ さん) に返信
> Panel1やPictureBoxに届いたMouseWheelのメッセージをフォーム側に転送して
> はどうでしょうか?

itoさんへ返信させていただいた通り、PictureBoxのMouseWheelイベントをハンドルすることで、スクロールバーが表示された状態でも拡大縮小ができるようにはなりました。
しかし、Ctrlキーが押された状態のときスクロールバーを動かないようにする問題が解決しませんでした。

回答ありがとうございます。参考にさせていただきます。
引用返信 編集キー/
■78971 / inTopicNo.9)  Re[6]: AutoScrollによるスクロールバーを制御したい
□投稿者/ Hongliang (416回)-(2016/02/26(Fri) 14:03:25)
Ctrlつきのホイール操作を処理した箇所で、イベント引数eをHandledMouseEventArgsにキャストし、それのHandledをTrueに設定することで、他のコントロールのホイール操作時の処理を行わせないようにすることが可能です。

ただ、MouseWheelはフォーカスのあるコントロールに持って行かれるはずなので、その辺大丈夫でしょうか…。
引用返信 編集キー/
■78972 / inTopicNo.10)  Re[7]: AutoScrollによるスクロールバーを制御したい
□投稿者/ パン (6回)-(2016/02/26(Fri) 14:24:13)
No78971 (Hongliang さん) に返信
> Ctrlつきのホイール操作を処理した箇所で、イベント引数eをHandledMouseEventArgsにキャストし、それのHandledをTrueに設定することで、他のコントロールのホイール操作時の処理を行わせないようにすることが可能です。
>
> ただ、MouseWheelはフォーカスのあるコントロールに持って行かれるはずなので、その辺大丈夫でしょうか…。

回答ありがとうございます。

示していただいた方法で求める仕様を満たすことができました。
現状フォーム内のどのコントロールにフォーカスがあっても目的の動作をしているので、問題ないと考えています。

とりあえずこの問題については解決済みとさせていただきます。
迅速な回答ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -