重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
'把“Dim graph As Graphics = Me.CreateGraphics”挪到“Button1_Click”事件内,调试过成功!
10年积累的网站设计制作、成都网站设计经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站制作后付款的网站建设流程,更有花垣免费网站建设让你可以放心的选择与我们合作。
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim graph As Graphics = Me.CreateGraphics
Dim pen2 As Pen = New Pen(Color.Green, 3)
graph.DrawLine(pen2, 400, 400, 500, 200)
End Sub
End Class
[{"word":"VB.NET画直线方法\n该方法绘制一条连接由坐标对指定的两个点的线条,所以我们需要指定这两个点的坐标,如下所示、\nDrawL in e(pen,x1.y1,x2,y2)或者DrawL in e(pen,Po in t1,Poin t2)\n下面示例将在PictureBox控件表面绘制一条直线、\nDim g As\nGraphics=Me.PictureBox\n1.CreateGraphics\nDim mpen As New\nPen(Color.Red)g.DrawLin e(mpen,0,80,0,160)\n也可以使用如下代码来实现一样的甲\n__\n"}]
绘图是系统内部操作的,不需要懂原理
方法就在那里,只有会用和不会用,你的代码告诉它绘制,它就会绘制。它(方法)究竟如何去绘制的并不是重点,反正它会绘制。
drawline(绘线)方法很简单,第一个参数是pen,它确定线条的颜色、宽度和样式。第二、第三个参数都是point类型,确定两个点的位置,绘制直线。
可以把所有画的线都保存在一个列表中,画的时候全部画出即可。如下:
Public Class Form1
Class Line '直线类
Public Point1, Point2 As Point '成员,直线的两个端点
Sub New(p1 As Point, p2 As Point) '构造方法
Point1 = p1
Point2 = p2
End Sub
Public Sub Draw(g As Graphics) '绘制方法
g.DrawLine(Pens.Black, Point1, Point2)
End Sub
End Class
Private Lines As New List(Of Line) '列表用于保存所有画下的直线
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
BackColor = Color.White
DoubleBuffered = True '开启双缓冲可有效避免闪烁
End Sub
Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown
Lines.Add(New Line(e.Location, e.Location)) '在直线列表中添加直线
End Sub
Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
If e.Button Windows.Forms.MouseButtons.Left Then Return '左键未按下
'鼠标拖动时改变列表最后一条直线(也即当前直线的第二个端点)
Lines(Lines.Count - 1).Point2 = e.Location
Refresh() '刷新窗体
End Sub
'在Form的Paint事件中绘制所有直线,每次Form1重绘时都会触发Paint事件
'PS: 也可以通过重写OnPaint方法来达到类似的效果
Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias '开启抗锯齿
For Each l In Lines '遍历所有直线
l.Draw(e.Graphics) '调用绘制方法,传入的参数可以理解为画布
Next
End Sub
End Class
运行效果:
代码写起来可能比较麻烦,给你个思路,就是用GraphicsPath来绘制,然后通过绘制目标的鼠标移动事件来获取当前鼠标在绘制目标中的实际位置,再通过GraphicsPath的IsVisible()方法来确认鼠标是否包含在GraphicsPath中。
DrawLine直线比较容易处理,只要得到Line的坐标点,然后比较当前鼠标坐标就好。
Form_load事件运行的时候,窗体里面的控件尚未初始化,以下代码经测试可行:
Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
e.Graphics.DrawLine(Pens.Blue, 0, 0, 111, 111)
End Sub