Vb.net 如何画一条线并拖动&;调整它的大小?

Vb.net 如何画一条线并拖动&;调整它的大小?,vb.net,winforms,draw,Vb.net,Winforms,Draw,我想在PictureBox控件上画一条线(更准确地说,是一个箭头)。(不为图像本身画一条线) 然后,我想抓取这条线,移动它并通过拖动来调整它的大小(改变它的X,Y,X',Y') 我该怎么做 我想,首先,我应该画一条线,把画的线作为一个独立的对象。。。但是我只有一个概念,没有实际的概念 下图是我找到的一个示例,但无法实现 这正是我想做的。绘制箭头、移动、调整大小和擦除 您可以在设计时和运行时使用LineShape控件在窗体或容器上绘制水平、垂直或对角线 Imports Microsoft.Vis

我想在PictureBox控件上画一条线(更准确地说,是一个箭头)。(不为图像本身画一条线)

然后,我想抓取这条线,移动它并通过拖动来调整它的大小(改变它的X,Y,X',Y')

我该怎么做

我想,首先,我应该画一条线,把画的线作为一个独立的对象。。。但是我只有一个概念,没有实际的概念

下图是我找到的一个示例,但无法实现

这正是我想做的。绘制箭头、移动、调整大小和擦除


您可以在设计时和运行时使用
LineShape
控件在窗体或容器上绘制水平、垂直或对角线

Imports Microsoft.VisualBasic.PowerPacks


Dim canvas As New ShapeContainer
Dim theLine As New LineShape
' Set the form as the parent of the ShapeContainer.
canvas.Parent = Me
' Set the ShapeContainer as the parent of the LineShape.
theLine.Parent = canvas
' Set the starting and ending coordinates for the line.
theLine.StartPoint = New System.Drawing.Point(0, 0)
theLine.EndPoint = New System.Drawing.Point(640, 480)

在设置
起点
终点
时,使用
PictureBox.Position.X
PictureBox.Size.Height
PictureBox.Size.Width
作为X,Y坐标。我不会提供确切的代码,而是提供您需要遵循的步骤序列。希望你能从那里学到:

  • 创建一个新的UserControl。将其命名为
    DrawingCanvas
    ArrowsPond
    或其他任何名称
  • 将控件的
    DoubleBuffered
    属性设置为
    True
    以进行平滑绘制
  • 定义一个名为
    Arrow
    的全局
    (而非
    结构
    ),该类具有
    类型的两个属性
    开始
    结束
    。声明一个全局
    列表(箭头)
    以存储所有箭头位置
  • 覆盖
    OnMouseDown()
    。在此处将名为
    IsMouseDown
    的全局标志设置为
    True
    。将名为
    MouseDownPos
    Point
    类型的全局变量设置为
    e.Location
  • 覆盖
    OnMouseUp()
    。如果
    IsMouseDown
    True
    ,则将其设置为
    False
    ,并使用
    Start=MouseDownPos
    End=e.Location
    向列表中添加一个新的
    箭头
  • 重写OnMouseMove()。如果
    IsMouseDown
    True
    ,请调用
    Me.Invalidate()
  • 覆盖
    OnPaint()
    并使用
    Graphics.DrawLine()方法绘制
    列表中的所有箭头
  • 这是绘图部分。现在要处理调整零件尺寸的问题:

  • OnMouseMove()
    中,如果
    IsMouseDown
    False
    ,请检查
    e.Location
    是否足够靠近列表中的任何起点或终点。您可以使用简单的欧几里德距离来实现这一点,并设置任意阈值(比如10像素)以更客观的方式定义“足够近”。如果找到这样一个点,请将其引用存储在名为
    Arrow
    的全局变量中,并在鼠标下将光标形状设置为Resize,以指示用户现在可以拖动该点。如果未检测到任何闭合点,请将鼠标下的
    箭头设置为
    并将光标重置回
    默认值
    。您需要最后一个名为
    IsOnHead
    Boolean
    类型的全局变量来跟踪鼠标是否靠近箭头的头部或尾部
  • 在移动鼠标的
    OnMouseMove
    中,如果
    IsMouseDown
    True
    且鼠标下的
    arrow
    不是
    Nothing
    ,则不执行上面列出的常规操作,根据
    IsOnHead
    和调用
    Invalidate()
    将鼠标下
    arrow的
    Start
    End
    属性设置为
    e.Location

  • 这只是你需要做的事情的基本框架,有很多你想玩的可能性。要绘制箭头,您需要使用
    属性。

    如果没有代码,我们就帮不上忙。从这样的地方开始