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

ドラッグでスクロール

環境/言語:[環境(Windows2000)、使用言語(C#)、.NET Framework(1.1)]
分類:[.NET]

初めて投稿します。
まだ初心者ですがよろしくお願い致します。

AutoScroll付きのPanel(panel1とします)の上に
PictureBox(pictureBox1とします)を配置し、
そこにGraphicsで線などを描画しています。

他のコントロールよりpictureBox1のサイズを変更でき、
panel1より大きくなるとスクロールバーが表示されます。

現在スクロールバーを操作する事により
pictureBox1の隠れた部分を表示(スクロールさせる事)はできるのですが、
pictureBox1をドラッグしてマウスを移動させる事で
同様の処理を行えないでしょうか?
SIVAさん、こんばんは。

> 初めて投稿します。
> まだ初心者ですがよろしくお願い致します。
>
> AutoScroll付きのPanel(panel1とします)の上に
> PictureBox(pictureBox1とします)を配置し、
> そこにGraphicsで線などを描画しています。
>
> 他のコントロールよりpictureBox1のサイズを変更でき、
> panel1より大きくなるとスクロールバーが表示されます。
>
> 現在スクロールバーを操作する事により
> pictureBox1の隠れた部分を表示(スクロールさせる事)はできるのですが、
> pictureBox1をドラッグしてマウスを移動させる事で
> 同様の処理を行えないでしょうか?

MouseMoveイベントなんかを使って、マウスの動いた方向分だけスクロールさせたらいいのでは?
■No5445に返信(ぺがらぼさんの記事)
> MouseMoveイベントなんかを使って、マウスの動いた方向分だけスクロールさせたらいいのでは?

ご教授ありがとうございます。

試しに
private Point pnt;
private bool bFlag;

private void pictureBox1_MouseDown(...省略...) {
pnt = new Point(e.X, e.Y);
bFlag = true;
}

private void pictureBox1_MouseUp(...省略...) {
bFlag = false;
}

private void pictureBox1_MouseMove(...省略...) {
if(bFlag) {
int x = e.X - pnt.X;
int y = e.Y - pnt.Y;
panel1.AutoScrollPosition = new Point(x * -1, y * -1);
}
}
とやってみた所スクロールするにはするのですが、
ドラッグ中のpictureBox1がブルブル震えるような(?)不穏な動きをします。
なんとかスマートにスクロールはさせられないでしょうか?
■No5535に返信(SIVAさんの記事)

 SIVAさん、こんばんは。深山と申します。

> ドラッグ中のpictureBox1がブルブル震えるような(?)不穏な動きをします。

 こちらでも確認しました。検証したところ

 AutoScrollPosition プロパティを設定する
→設定された値に応じて pictureBox1 が移動させられる
→(相対的に)マウス ポインタの座標値が変わる

のが原因のようです。
 ですので、マウス ポインタの座標値をスクリーン座標で持つようにしてあげれば解決しますよ。
こんな感じでどうでしょう?
# 直打ちなのでタイプ ミスがあるかも知れません(^_^;)

> private Point pnt;
> private bool  bFlag;
> 
> private void pictureBox1_MouseDown(...省略...) {
>     pnt = new Point(e.X, e.Y);
      pnt = pictureBox1.PointToScreen(pnt);
>     bFlag = true;
> }
> 
> private void pictureBox1_MouseUp(...省略...) {
>     bFlag = false;
> }
> 
> private void pictureBox1_MouseMove(...省略...) {
>     if(bFlag) {
          Point pnt2 = new Point(e.X, e.Y);
          pnt2 = pictureBox1.PointToScreen(pnt2);
          int x = pnt2.X - pnt.X;
          int y = pnt2.Y - pnt.Y;
>         panel1.AutoScrollPosition = new Point(x * -1, y * -1);
>     }
> }



 ただ、これだとスクロール バーの操作と組み合わせた時に意図した動作にならないのでは
ないでしょうか?
 もしそうでしたら、 AutoScrollPosition プロパティを変更するときに現在の値とマウスの
移動分から新しい値を計算するようにする必要があります。
■No5573に返信(深山さんの記事)
> マウスポインタの座標値をスクリーン座標で持つようにしてあげれば解決しますよ。
おかげさまでPointToScreen()を使用する事で、
自分がイメージする動作にかなり近くなりました。

あとは自分で微調整をする事でなんとかなると思います。

ご教授ありがとうございました<(_ _)>
解決済み!

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