• ベストアンサー

C# FlowLayoutPanelのコントロール

今、C#の学習でFlowLayoutPanelを使っていて、このパネル内にあるpictureboxの配置をマウスでドラッグ&ドロップして動かそうと思っているのですが未だ実装することができません。 どのようにすればpictureboxをドラッグして配置を変えることができるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • sean9
  • ベストアンサー率86% (26/30)
回答No.1

こんにちは。 ソースはざっくりした説明なので、改変してください。 (1)マウスダウン時に移動開始して (2)マウスムーブに合わせて (3)マウスダウン時に移動を終了、マウス位置によってFlowLayoutPanelの何番目かを判断 といった感じでどうでしょうか。 以下のサンプルはflowLayoutPanel1にpictureBox1からpictureBox3の3つのPictureBoxが横並びにある場合になります。 また、picureBox1が1番左にある場合に動かすことができます。 余計なものは入れず、考え方を説明できたらとおもいます。 public partial class Form1 : Form { private bool _onMoving = false; //ドラッグ中かどうか private Point _mouseLocation = new Point(0, 0); private Form _tempBox; //ドラッグ中のPictureBoxを見せるためのフォーム public Form1() { InitializeComponent(); } private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { var pictureBox = sender as PictureBox; //フォームの設定をします。PictureBoxでもいいのですが、半透明処理なども考慮しこちらのほうが楽かと。 //背景にpictureBox1のImageなどを貼り付けてください。 _tempBox = new Form(); _tempBox.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; _tempBox.MinimumSize = new System.Drawing.Size(10, 10); _tempBox.Size = pictureBox.Size; _tempBox.BackColor = pictureBox.BackColor; _tempBox.Visible = true; _tempBox.Opacity = 0.5; _tempBox.ShowInTaskbar = false; _mouseLocation = e.Location; _onMoving = true; } private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { if (_onMoving) { Point location = new Point(MousePosition.X - _mouseLocation.X, MousePosition.Y - _mouseLocation.Y); _tempBox.Location = location; } } private void pictureBox1_MouseUp(object sender, MouseEventArgs e) { //ポジションの判定 //今回は横並びにのみ対応させました。ご自身のFlowLayoutPanelの状況にあわせて判定してください。 int pictureBox2CenterX = pictureBox2.Location.X + pictureBox2.Width / 2; int pictureBox3CenterX = pictureBox3.Location.X + pictureBox3.Width / 2; if (pictureBox2CenterX < e.X && e.X < pictureBox3CenterX) { flowLayoutPanel1.Controls.SetChildIndex(pictureBox1, 1); } else if (pictureBox3CenterX < e.X) { flowLayoutPanel1.Controls.SetChildIndex(pictureBox1, 2); } _onMoving = false; _tempBox.Close(); } } ドラッグ中の描画が不要なようであれば、当然MouseMoveイベントの処理や_tempBox:フォームは要りません。 お役に立てれば幸いです。

tmg_890
質問者

お礼

ありがとうございました!! 並べ替えで詰まっていて参考にさせていただきようやく列と行の両方の並べ替えをすることができました!!!

関連するQ&A