このようなものを試すことができます。テスト用に、3 つの異なる背景色を持つ 3 つのオーバーラップする PictureBoxes を追加しました。
初期フォーム設定:
private bool isDragging = false;
private Point dragOffset = Point.Empty;
private PictureBox dragBox;
public Form1() {
InitializeComponent();
panel1.MouseDown += new MouseEventHandler(panel1_MouseDown);
panel1.MouseMove += new MouseEventHandler(panel1_MouseMove);
panel1.MouseUp += new MouseEventHandler(panel1_MouseUp);
panel1.Paint += new PaintEventHandler(panel1_Paint);
panel1.DragEnter += new DragEventHandler(panel1_DragEnter);
panel1.DragDrop += new DragEventHandler(panel1_DragDrop);
}
ドラッグ ドロップ イベント:
void panel1_DragDrop(object sender, DragEventArgs e) {
dragBox.Location = panel1.PointToClient(
new Point(e.X - dragOffset.X, e.Y - dragOffset.Y));
panel1_MouseUp(null, null);
}
void panel1_DragEnter(object sender, DragEventArgs e) {
e.Effect = DragDropEffects.Move;
}
マウス イベント:
void panel1_MouseMove(object sender, MouseEventArgs e) {
if (dragBox != null && !isDragging) {
isDragging = true;
panel1.DoDragDrop(dragBox, DragDropEffects.Move);
}
}
void panel1_MouseDown(object sender, MouseEventArgs e) {
if (e.Button == MouseButtons.Left) {
foreach (PictureBox pb in panel1.Controls.OfType<PictureBox>()
.OrderBy(x => panel1.Controls.GetChildIndex(x))) {
if (pb.Bounds.Contains(e.Location)) {
pb.BringToFront();
pb.Visible = true;
dragBox = pb;
dragOffset = new Point(e.X - pb.Left, e.Y - pb.Top);
panel1.Invalidate();
break;
}
}
}
}
void panel1_MouseUp(object sender, MouseEventArgs e) {
foreach (PictureBox pb in panel1.Controls.OfType<PictureBox>()) {
pb.Visible = false;
}
dragBox = null;
isDragging = false;
}
ペイント イベント:
void panel1_Paint(object sender, PaintEventArgs e) {
foreach (PictureBox pb in panel1.Controls.OfType<PictureBox>()
.OrderByDescending(x => panel1.Controls.GetChildIndex(x))) {
e.Graphics.FillRectangle(new SolidBrush(pb.BackColor), pb.Bounds);
}
}
GetChildIndex
親パネルを使用して、パネル内の最上位の PictureBox コントロールを取得し、それが見つかった場合は、「クリックされた」ものを前面に表示して、子インデックスを更新します。
PictureBoxes は (ドラッグされない限り) 常に非表示であるため、このコードは正しい PictureBox を前面に表示します。一番上のボックスが最後にペイントされるように、PictureBoxes を逆の順序で描画するペイント イベントを追加しました。
選択した PictureBox を MouseDown で表示し、MouseUp で再度非表示にするようにコードを変更しました。
ドラッグ アンド ドロップ コードを追加しました。