如何在VB.NET中画一条线

时间:2013-07-27 07:58:04

标签: .net vb.net winforms pen

我试图用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

5 个答案:

答案 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)         下一个