【问题标题】:Draggable text or shapes on an image in C# or VB.NETC# 或 VB.NET 中图像上的可拖动文本或形状
【发布时间】:2012-06-29 20:29:36
【问题描述】:

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

提前感谢您的帮助。

【问题讨论】:

  • 或者,如果使用图片框是错误的方法,我愿意接受任何建议以使这样的事情发挥作用。

标签: c# .net vb.net winforms


【解决方案1】:

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

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);
    }
}

【讨论】:

  • @Rotem... 这正是我想要的!它为我指明了正确的方向。谢谢!
猜你喜欢
  • 2012-09-30
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多