1

我正在尝试使用 C# 或 VB.NET 创建一个 Winforms 应用程序,这将允许我将文本或形状放在图片框内现有图像的顶部,并使用鼠标拖动该文本或形状。例如,如果我想在图像上放置一个 90X90 的正方形,我会在“宽度”文本框中输入 90,在“高度”文本框中输入 90,然后单击图像,它将绘制在现有图像的顶部。然后我可以通过将鼠标移动到我想要的位置来定位它。如果需要,可能还有其他步骤(例如单击“插入矩形”按钮启动该过程)。我尝试了一些想法,例如调用一个例程,将图片框重置为其原始图像并在引发“鼠标移动”事件时绘制形状,但这显然太慢了。这是否应该在图片框的绘画事件中完成,如果是这样,有人可以指出我如何做到这一点的正确方向吗?这是可能的,还是我过度简化了这个想法?

在此先感谢您的帮助。

4

1 回答 1

2

下面是一个非常简单的示例,说明如何在父控件内绘制可拖动的矩形。

public class Draggable : PictureBox
{
    Rectangle shapeBounds;
    bool isDragging;
    Point dragPoint;

    public Draggable()
    {
        InitializeComponent();
        shapeBounds = new Rectangle(10, 10, 30, 30);
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        base.OnMouseDown(e);
        if (shapeBounds.Contains(e.Location))
        {
            isDragging = true;
            dragPoint = new Point(
                e.Location.X - shapeBounds.Location.X,
                e.Location.Y - shapeBounds.Location.Y);
        }
    }

    protected override void OnMouseUp(MouseEventArgs e)
    {
        base.OnMouseUp(e);
        isDragging = false;
    }

    protected override void OnMouseMove(MouseEventArgs e)
    {
        base.OnMouseMove(e);
        if (isDragging)
        {
            Point p = new Point(
                e.Location.X - dragPoint.X,
                e.Location.Y - dragPoint.Y);
            shapeBounds = new Rectangle(p, shapeBounds.Size);
            Invalidate();
        }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        e.Graphics.FillRectangle(Brushes.Red, shapeBounds);
    }
}
于 2012-06-29T12:29:36.530 回答