1

panel1_MouseMove イベントで問題が発生しました。List pBoxes 内に 3 つのピクチャ ボックスがあり、これらはすべてパネルに描画され、ピクチャ ボックス コントロールは Visible = false に設定されています。

問題は、画像が重なっている場合、1 つの画像をクリックすると、その背後にある pictureBox が選択される可能性があることです。そのようですここに画像の説明を入力

コードは次のとおりです。

    private void panel1_MouseMove(object sender, MouseEventArgs e)
{
if (picturebox1.Bounds.Contains(e.Location) && !picturebox1.Visible)
{
picturebox1.Show();
picturebox2.Hide();
picturebox3.Hide();
}
if (picturebox2.Bounds.Contains(e.Location) && !picturebox2.Visible)
{
picturebox1.Hide();
picturebox2.Show();
picturebox3.Hide();
}
if (picturebox3.Bounds.Contains(e.Location) && !picturebox3.Visible)
{
picturebox1.Hide();
picturebox2.Hide();
picturebox3.Show();
}

はい、特定のアプリケーションには Bounds.Contains を使用する必要があります。私の質問を見る別の方法は、Visible コントロールなしで pictureBox1__MouseClick イベントを作成しようとしているということです。

4

1 に答える 1

1

このようなものを試すことができます。テスト用に、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 で再度非表示にするようにコードを変更しました。

ドラッグ アンド ドロップ コードを追加しました。

于 2012-08-08T19:48:49.497 に答える