我试图用VB.NET绘制一个简单的行。
我的代码如下,但是当我运行代码时,只显示表单!没有线路。
我在这里做错了什么?
Public Class Form1
Dim pen As System.Drawing.Graphics
Private Sub Form1_Load(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles MyBase.Load
pen = Me.CreateGraphics()
pen.DrawLine(Pens.Azure, 10, 10, 20, 20)
End Sub
End Class
答案 0 :(得分:9)
基本上,你做错了就是使用CreateGraphics
方法。
这是你很少需要做的事情。当然,这并不是说方法被破坏了。它完全按照它所说的做法:记录为:返回表示表单绘图表面的Graphics
对象。
问题在于,无论何时重新绘制表单(可能由于多种原因而发生),Graphics
对象基本上都会重置。因此,您所获得的所有内容都将被删除。
首次加载时,表单始终重绘,因此在CreateGraphics
事件处理程序方法中使用Load
never 是有意义的。它也会在最小化和恢复时重新绘制,被另一个窗口覆盖,或者甚至调整(其中一些取决于您的操作系统,图形驱动程序和表单的属性,但这超出了点)子>
您唯一可以使用CreateGraphics
的时间是您希望向用户显示立即反馈不应在重绘期间保留。例如,在MouseMove
事件的处理程序中,显示拖放的反馈。
那么,解决方案是什么? 始终在Paint
事件处理程序方法中进行绘制。这样,它会在重绘过程中持续存在,因为“重绘”基本上涉及提升Paint
事件。
当引发Paint
事件时,处理程序将传递PaintEventArgs
类的实例,该实例包含可以绘制的Graphics
对象。
所以这就是你的代码应该的样子:
Public Class Form1
Protected Overridable Sub OnPaint(e As PaintEventArgs)
' Call the base class
MyBase.OnPaint(e)
' Do your painting
e.Graphics.DrawLine(Pens.Azure, 10, 10, 20, 20)
End Sub
End Class
(另请注意,在上面的代码中,我重写了OnPaint
方法,而不是处理相应的Paint
事件。这被认为是处理派生类中事件的最佳实践。方式将起作用。)
答案 1 :(得分:2)
你应该这样做来画线
Public Class Form1
Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Dim myPen As Pen
'instantiate a new pen object using the color structure
myPen = New Pen(Color=Color.Blue, Width=2)
'draw the line on the form using the pen object
e.Graphics.DrawLine(pen=myPen, x1=100, y1=150, x2=150, y2=100)
End Sub
End Class
或者更简单的解决方案是在Form Paint Event中添加此代码
e.Graphics.DrawLine(Pens.Azure, 10, 10, 20, 20)
答案 2 :(得分:1)
您应该将此代码放在表单的Paint
事件中,此处发生的是正在绘制的行,但是表单在完成加载时会重新绘制,因此您的行消失。此外,尝试黑色或更具对比度的颜色,或者您会错过窗体背景颜色。
答案 3 :(得分:0)
您可以通过向表单添加groupbox控件来实现此目的。然后删除文本(保留空白文本),将高度设置为1并选择所需的背景颜色。
答案 4 :(得分:0)
画多条线 黑色铅笔作为新笔(颜色,红色,3) Dim hwnd As IntPtr = PictureBox1.Handle 将myGraphics视作图形 myGraphics = Graphics.FromHwnd(hwnd) 昏暗x1作为整数= 100 昏暗x2作为整数= 500 昏暗y1为整数= 10 昏暗的y2作为整数= y1 昏暗i等于Int16 = 10,两个间隙等于Int16 = 20 'myGraphics.DrawLine(blackPen,x1,y1,x2,y2) 对于i = 1到10 myGraphics.DrawLine(blackPen,x1,y1 + i *双向间隙,x2,y1 + i *双向间隙) 'myGraphics.DrawLine(blackPen,x1,y1 + 2 * 20,x2,y1 + 2 * 20) 'myGraphics.DrawLine(blackPen,x1,y1 + 3 * 20,x2,y1 + 3 * 20) 下一个 x1 = 100 x2 = 100 y1 = 10 +双向间隙 y2 = 200 +双向间隙/ 2 blackPen =新笔(Color.Blue,3) 对于i = 1到21 'myGraphics.DrawLine(blackPen,x1,y1,x2,y2) myGraphics.DrawLine(blackPen,x1 +(i-1)* bothgap,y1,x2 +(i-1)* bothgap,y2) 'myGraphics.DrawLine(blackPen,x1 + 2 * bothgap,y1,x2 + 2 * bothgap,y2) 下一个