我想在PictureBox控件上绘制一条线(更准确地说,一个箭头)。 (不要在图像上画一条线)
然后,我想抓住线,移动它并调整它(通过拖动来改变它的X,Y,X',Y')。
我该怎么做?
我认为,首先,我应该绘制一条线并将绘制的线作为一个独立的对象...但我只有一个概念而不是实际的概念..
下面的图片是我发现但无法实现的示例。
这正是我想做的。绘制箭头,移动,调整大小和擦除。
http://www.codeproject.com/Articles/2097/LineTracker-A-CRectTracker-like-Class-for-Lines
答案 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.X
和PictureBox.Position.Y
PictureBox1.Size.Height
,PictureBox1.Size.Width
,StartPoint
和EndPoint
作为X,Y坐标
答案 1 :(得分:0)
我已经在.NET中多次完成了这个和更复杂的矢量绘图。我不会向您提供确切的代码,而是您需要遵循的步骤顺序。希望你能从那里拿起:
DrawingCanvas
或ArrowsPond
或其他任何内容。DoubleBuffered
属性设置为True
以便顺利绘制。Class
的全局Structure
(不是Arrow
),其中包含两个属性Start
和End
Point
类型。声明全局List(Of Arrow)
以存储您的所有箭头位置。OnMouseDown()
。在此处将名为IsMouseDown
的全局标记设置为True
。将名为Point
的{{1}}类型的全局变量设置为MouseDownPos
。e.Location
。如果OnMouseUp()
为IsMouseDown
,请将其设置为True
,并使用False
和Arrow
将新Start=MouseDownPos
添加到您的列表中。End=e.Location
。如果OnMouseMove()
为IsMouseDown
,请致电True
。Me.Invalidate()
并使用OnPaint()
方法绘制List
中的所有箭头。这是绘图部分。现在来处理调整大小部分:
Graphics.DrawLine()
中,如果OnMouseMove()
为IsMouseDown
,请检查False
是否足够接近列表中的任何起点或终点。您可以使用简单的欧几里德距离并设置任意阈值(例如10个像素)来定义"足够接近"以更客观的方式。如果找到这样的点,则将其引用存储在名为e.Location
的{{1}}类型的全局变量中,并将光标形状设置为Resize以向用户指示他现在可以拖动该点。如果您未检测到任何关闭点,请将Arrow
设置为ArrowUnderMouse
并将光标重置为ArrowUnderMouse
。您需要一个名为Nothing
Default
类型的最后一个全局变量来跟踪鼠标是否靠近箭头的头部或尾部。IsOnHead
中,如果Boolean
为OnMouseMove
且IsMouseDown
不是True
,则不要执行上面列出的正常操作,而是设置{{ 1 {}或ArrowUnderMouse
属性Nothing
至Start
,具体取决于End
和致电ArrowUnderMouse
。这只是您需要做的事情的骨架,并且您有很多可能与之相关的可能性。要绘制箭头,您需要使用e.Location
属性。