2

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

此外,如果其他人知道如何在 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;
            }                
        }           
    }
4

1 回答 1

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;

在列表框中显示这些矩形非常容易。只需将列表框的项目绑定到列表即可。您可能需要覆盖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相应地重新定位。

于 2012-10-03T09:15:37.670 回答