winforms 如何在VB.NET中画线

bogh5gae  于 2023-05-18  发布在  .NET
关注(0)|答案(5)|浏览(269)

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

kcrjzv8t1#

基本上,你做错的是使用了CreateGraphics方法。
这是你很少,如果有的话,需要做的事情。当然,这并不是说这个方法被破坏了。它确实做到了它说的:记录如下:返回一个Graphics对象,表示窗体的绘图面。
问题是,每当你的表单被重绘时(这可能会有很多原因),Graphics对象基本上会被 reset。结果是,你所画到你所得到的一切都被抹去了。
表单在第一次加载时 * 总是 * 重绘,因此在Load事件处理程序方法中使用CreateGraphicsnever 是有意义的。它也将在任何时候被最小化和还原,被另一个窗口覆盖,甚至调整大小(其中一些取决于您的操作系统,图形驱动程序,和您的窗体的属性,但这超出了重点)。
唯一可能使用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

(Note在上面的代码中,我覆盖了OnPaint方法,而不是处理相应的Paint事件。这被认为是处理派生类中事件的最佳实践。但无论哪种方式都能奏效)。

r1zhe5dt

r1zhe5dt2#

你应该这样做来划清界限

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

或者更简单的解决方案是在窗体绘制事件中添加此代码

e.Graphics.DrawLine(Pens.Azure, 10, 10, 20, 20)
oyt4ldly

oyt4ldly3#

你应该把这段代码放在表单的Paint事件中,这里发生的事情是,线条正在被绘制,但是表单在完成加载时被重新绘制,所以你的线条消失了。此外,请尝试使用黑色或对比度更高的颜色,否则您会错过它与窗体的窗口背景色的对比。

p5cysglq

p5cysglq4#

您可以通过向窗体添加groupbox控件来实现这一点。然后删除文本(保持空白文本),将高度设置为1,并选择所需的背景颜色。

brc7rcf0

brc7rcf05#

绘制多条线

Dim blackPen As New Pen(Color.Red, 3)
            Dim hwnd As IntPtr = PictureBox1.Handle
            Dim myGraphics As Graphics
            myGraphics = Graphics.FromHwnd(hwnd)
            Dim x1 As Integer = 100
            Dim x2 As Integer = 500
            Dim y1 As Integer = 10
            Dim y2 As Integer = y1
            Dim i As Int16 = 10, bothgap As Int16 = 20
            ' myGraphics.DrawLine(blackPen, x1, y1, x2, y2)
            For i = 1 To 10
                myGraphics.DrawLine(blackPen, x1, y1 + i * bothgap, x2, y1 + i * bothgap)
                'myGraphics.DrawLine(blackPen, x1, y1 + 2 * 20, x2, y1 + 2 * 20)
                'myGraphics.DrawLine(blackPen, x1, y1 + 3 * 20, x2, y1 + 3 * 20)
            Next
            x1 = 100
            x2 = 100
            y1 = 10 + bothgap
            y2 = 200 + bothgap / 2
            blackPen = New Pen(Color.Blue, 3)
            For i = 1 To 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)
            Next
    ```

相关问题