如何划线和拖拽调整大小?

时间:2014-03-25 16:17:22

标签: vb.net winforms draw

我想在PictureBox控件上绘制一条线(更准确地说,一个箭头)。 (不要在图像上画一条线)

然后,我想抓住线,移动它并调整它(通过拖动来改变它的X,Y,X',Y')。

我该怎么做?

我认为,首先,我应该绘制一条线并将绘制的线作为一个独立的对象...但我只有一个概念而不是实际的概念..

下面的图片是我发现但无法实现的示例。

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

enter image description here http://www.codeproject.com/Articles/2097/LineTracker-A-CRectTracker-like-Class-for-Lines

2 个答案:

答案 0 :(得分:1)

您可以使用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.XPictureBox.Position.Y

时,使用PictureBox1.Size.HeightPictureBox1.Size.WidthStartPointEndPoint作为X,Y坐标

答案 1 :(得分:0)

我已经在.NET中多次完成了这个和更复杂的矢量绘图。我不会向您提供确切的代码,而是您需要遵循的步骤顺序。希望你能从那里拿起:

  1. 创建一个新的UserControl。将其命名为DrawingCanvasArrowsPond或其他任何内容。
  2. 将控件的DoubleBuffered属性设置为True以便顺利绘制。
  3. 定义名为Class的全局Structure(不是Arrow),其中包含两个属性StartEnd Point类型。声明全局List(Of Arrow)以存储您的所有箭头位置。
  4. 覆盖OnMouseDown()。在此处将名为IsMouseDown的全局标记设置为True。将名为Point的{​​{1}}类型的全局变量设置为MouseDownPos
  5. 覆盖e.Location。如果OnMouseUp()IsMouseDown,请将其设置为True,并使用FalseArrow将新Start=MouseDownPos添加到您的列表中。
  6. 覆盖End=e.Location。如果OnMouseMove()IsMouseDown,请致电True
  7. 覆盖Me.Invalidate()并使用OnPaint()方法绘制List中的所有箭头。
  8. 这是绘图部分。现在来处理调整大小部分:

    1. Graphics.DrawLine()中,如果OnMouseMove()IsMouseDown,请检查False是否足够接近列表中的任何起点或终点。您可以使用简单的欧几里德距离并设置任意阈值(例如10个像素)来定义"足够接近"以更客观的方式。如果找到这样的点,则将其引用存储在名为e.Location的{​​{1}}类型的全局变量中,并将光标形状设置为Resize以向用户指示他现在可以拖动该点。如果您未检测到任何关闭点,请将Arrow设置为ArrowUnderMouse并将光标重置为ArrowUnderMouse。您需要一个名为Nothing Default类型的最后一个全局变量来跟踪鼠标是否靠近箭头的头部或尾部。
    2. IsOnHead中,如果BooleanOnMouseMoveIsMouseDown不是True,则不要执行上面列出的正常操作,而是设置{{ 1 {}或ArrowUnderMouse属性NothingStart,具体取决于End和致电ArrowUnderMouse
    3. 这只是您需要做的事情的骨架,并且您有很多可能与之相关的可能性。要绘制箭头,您需要使用e.Location属性。