如何选择和移动pictureBox中的矩形?

时间:2012-10-03 07:01:16

标签: c# select draw move

只是想知道如何实际选择我绘制的矩形然后能够移动它?我还需要删除它,但我可以解决这个问题。关于我需要做什么,只是有点迷失。伪代码或实际代码很好,只是一个垫脚石将不胜感激。

此外,如果其他人知道如何在listBox中实际显示矩形X和Y,那也很棒。但目前,最重要的问题是优先考虑。

这是我绘制矩形的方式:

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {

        if (buttonDown)
        {
            if (pictureBox1.Image != null)
            {
                draw = true;
                Graphics g = Graphics.FromImage(imageFile);
                Pen pen1 = new Pen(color, 4);
                g.DrawRectangle(pen1, e.X - 5, e.Y - 5, 5, 5);
                g.Save();
                pictureBox1.Image = imageFile;
            }                
        }           
    }

1 个答案:

答案 0 :(得分:2)

为了实现此类行为,您必须存储有关矩形的信息。例如。在这样的课程中:

class Rect
{
    int X { get; set; }
    int Y { get; set; }
    int Width { get; set; }
    int Height { get; set; }
}

请注意,已有Rectangle类型。你也可以使用它,但由于它是一个结构,你必须以不同的方式处理选择。

现在您可以创建一个矩形列表和选择:

List<Rect> rects = new List<Rect>();
Rect selectedRect = null;

在列表框中显示这些rects非常简单。只需将列表框的项目绑定到列表即可。您可能需要覆盖ToString()才能获得用户友好的输出。

绘制矩形可能如下所示:

foreach(var r in rects)
{
    g.DrawRectangle(pen1, r.X, r.Y, r.Width, r.Height);
    ...
}

您可以突出显示所选的矩形。例如。使用不同的笔或其他矩形:

if(selectedRect == r)
    g.DrawRectangle(pen1, r.x - 5, r.Y - 5, r.Width + 10, r.Height + 10);

MouseDown事件或其他适当的事件中,您可以将选择设置为单击的矩形:

foreach(var r in rects)
    if(e.X >= r.X && e.X <= r.X + r.Width && e.Y >= r.Y && e.Y <= r.Y + r.Height)
        selectedRect = r;

要移动矩形,您将保存已单击的矩形点(距离左上角的距离)。在鼠标移动事件中,检查左侧按钮是否已关闭,并相应地重新定位selectedRect