none
ピクチャーボックスの移動(C#) RRS feed

  • 質問

  • WindowsFormアプリケーションで、決められたサイズのPane内でPictureBoxをマウスで自由に移動するために、一番いい方法を教えてください。

    (1) Panel内でマウス左をクリックする。一定のサイズのPictureBoxを表示する。

    (2) マウス左がクリックされている間は、そのPictureBoxはPanel内を自由に移動。

    (3) マウス左がリリースされたところで、PictureBoxは固定。

    宜しくお願いします。

    2011年2月3日 6:16

回答

  • MouseDown、MouseMove、MouseUp イベントをつかまえて、PictureBox を動かしてあげればいいと思います。(これが一番いい方法かどうかは分かりません。)

        private Size szOrigin = Size.Empty;
    
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
          if (e.Button == MouseButtons.Left)
          {
            szOrigin = new Size(e.X, e.Y);
          }
        }
    
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
          if (e.Button == MouseButtons.Left)
          {
            pictureBox1.Location = Point.Subtract(panel1.PointToClient(Cursor.Position), szOrigin);
          }
        }
    
        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
          szOrigin = Size.Empty;
        }
    
    


    あとはドラッグ中にパネルの外に飛び出さないようにガードしてあげればいいのではないでしょうか。
    • 回答としてマーク 山本春海 2011年2月9日 1:56
    2011年2月3日 6:37
  • 一番良い方法かどうかわかりませんが、マウスが移動できる範囲(Rectangle )は計算できますから、それをCursor.Clipにセットすれば良いのではないでしょうか?

    マウス・カーソルの移動可能領域を制限するには?
    http://www.atmarkit.co.jp/fdotnet/dotnettips/388limitcursor/limitcursor.html

    あとはMouseDown、MouseMove、MouseUpイベントでPictureBoxを移動させればよいと思います。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク 山本春海 2011年2月9日 1:56
    2011年2月3日 6:42
    モデレータ
  • もし(1)の動作と(2)の動作間がシームレスである場合は、Panel.MouseDownで

    PictureBoxをPanelのカーソル位置(x, y 少しマイナス位置がいいかも)に追加し、

    あとは既に出ている意見のようなPictureBox.MouseMoveとPictureBox.MouseUpを

    使う感じかなと思います。

    • 回答としてマーク 山本春海 2011年2月9日 1:56
    2011年2月3日 7:45

すべての返信

  • MouseDown、MouseMove、MouseUp イベントをつかまえて、PictureBox を動かしてあげればいいと思います。(これが一番いい方法かどうかは分かりません。)

        private Size szOrigin = Size.Empty;
    
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
          if (e.Button == MouseButtons.Left)
          {
            szOrigin = new Size(e.X, e.Y);
          }
        }
    
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
          if (e.Button == MouseButtons.Left)
          {
            pictureBox1.Location = Point.Subtract(panel1.PointToClient(Cursor.Position), szOrigin);
          }
        }
    
        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
          szOrigin = Size.Empty;
        }
    
    


    あとはドラッグ中にパネルの外に飛び出さないようにガードしてあげればいいのではないでしょうか。
    • 回答としてマーク 山本春海 2011年2月9日 1:56
    2011年2月3日 6:37
  • 一番良い方法かどうかわかりませんが、マウスが移動できる範囲(Rectangle )は計算できますから、それをCursor.Clipにセットすれば良いのではないでしょうか?

    マウス・カーソルの移動可能領域を制限するには?
    http://www.atmarkit.co.jp/fdotnet/dotnettips/388limitcursor/limitcursor.html

    あとはMouseDown、MouseMove、MouseUpイベントでPictureBoxを移動させればよいと思います。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク 山本春海 2011年2月9日 1:56
    2011年2月3日 6:42
    モデレータ
  • もし(1)の動作と(2)の動作間がシームレスである場合は、Panel.MouseDownで

    PictureBoxをPanelのカーソル位置(x, y 少しマイナス位置がいいかも)に追加し、

    あとは既に出ている意見のようなPictureBox.MouseMoveとPictureBox.MouseUpを

    使う感じかなと思います。

    • 回答としてマーク 山本春海 2011年2月9日 1:56
    2011年2月3日 7:45
  • totojo様、

    無事に動くことが確認されました。ありがとうございました。

    2011年2月3日 14:02