Vb.net 将Graphic.drawline添加到新面板

Vb.net 将Graphic.drawline添加到新面板,vb.net,Vb.net,如何在我刚刚用代码创建的面板上画一条线?我正在使用我自己的类面板MyPanel,它与常规面板的唯一区别是我给了它一个边框。在我的代码中,这是我得到的: Dim newPanel as New MyPanel dim graphicPanel as graphic = newPanel.createGraphic graphicPanel.drawline(pens.Black, 20, 65,20,65) basePanel.controls.add(newPanel) 该程序将添加几个面

如何在我刚刚用代码创建的面板上画一条线?我正在使用我自己的类面板MyPanel,它与常规面板的唯一区别是我给了它一个边框。在我的代码中,这是我得到的:

Dim newPanel as New MyPanel

dim graphicPanel as graphic = newPanel.createGraphic
graphicPanel.drawline(pens.Black, 20, 65,20,65)

basePanel.controls.add(newPanel)
该程序将添加几个面板(每个面板可能有点不同,我希望能够在它们上面画一些线,我可以稍后在其中修改,或者只是清除并创建新的)


由于我是在代码中创建此面板的,因此无法访问_Paint事件,我认为这就是上面的代码正常工作的原因?任何想法?

一旦面板失效,CreateGraphics将始终被“擦除”。 如果您使用自己的MyPanel类,那么您只需重写它的onPaint方法,并在该MyPanel类中画一条线(如果您的所有MyPanel都应该有这条线)

另请注意,如果您在代码中创建控件,您仍然可以访问它的所有事件。例如,在VB.NET中,您可以使用关键字WithEvents将其声明为全局的,也可以使用AddHandler将eventhandler添加到控件中

例如:

Class MyPanel
Inherits Panel
Protected Overrides Sub OnPaint(e As PaintEventArgs)
    MyBase.OnPaint(e)
    e.Graphics.DrawLine(System.Drawing.Pens.Black, 0, 0, Me.Width, Me.Height)
    e.Graphics.DrawLine(System.Drawing.Pens.Black, Me.Width, 0, 0, Me.Height)
End Sub
End Class
此示例将在面板中绘制2条对角线

//在中编辑了一个示例代码


面板失效后,CreateGraphics将始终“擦除”。 如果您使用自己的MyPanel类,那么您只需重写它的onPaint方法,并在该MyPanel类中画一条线(如果您的所有MyPanel都应该有这条线)

另请注意,如果您在代码中创建控件,您仍然可以访问它的所有事件。例如,在VB.NET中,您可以使用关键字WithEvents将其声明为全局的,也可以使用AddHandler将eventhandler添加到控件中

例如:

Class MyPanel
Inherits Panel
Protected Overrides Sub OnPaint(e As PaintEventArgs)
    MyBase.OnPaint(e)
    e.Graphics.DrawLine(System.Drawing.Pens.Black, 0, 0, Me.Width, Me.Height)
    e.Graphics.DrawLine(System.Drawing.Pens.Black, Me.Width, 0, 0, Me.Height)
End Sub
End Class
此示例将在面板中绘制2条对角线

//在中编辑了一个示例代码


关于

您的线不会显示,因为一旦重新绘制面板,线将不包括在内

当然,您可以访问面板的
Paint
事件,您可以使用该语句订阅动态创建的控件的事件

Private Sub CreatePanel()
    Dim newPanel As New MyPanel
    AddHandler newPanel.Paint, AddressOf MyPanel_Paint
    basePanel.Controls.Add(newPanel)
End Sub

Private Sub MyPanel_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs)
    e.Graphics.DrawLine(Pens.Black, 20, 65, 20, 65)
End Sub

您的线条不会显示,因为一旦重新绘制面板,线条将不包括在内

当然,您可以访问面板的
Paint
事件,您可以使用该语句订阅动态创建的控件的事件

Private Sub CreatePanel()
    Dim newPanel As New MyPanel
    AddHandler newPanel.Paint, AddressOf MyPanel_Paint
    basePanel.Controls.Add(newPanel)
End Sub

Private Sub MyPanel_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs)
    e.Graphics.DrawLine(Pens.Black, 20, 65, 20, 65)
End Sub

那么这样做,我还能向它传递值吗?如果我一个接一个地创建50个MyPanel,每个面板都会有自己的行,依赖于我传递给它的值,还是会像这样作为所有面板的参考?@goomba454:每个新面板都会有自己的变量和属性(除非您将其
共享
)。这就是
New
关键字的作用;实例化一个全新的、独立的面板实例。@goomba454:你可以给它一些属性,比如
X1
Y1
X2
Y2
。或者只是
点1
点2
。非常感谢你,这真是太棒了!!我真的很喜欢我t!这样做,我还能向它传递值吗?如果我一个接一个地创建50个MyPanel,每个面板是否都有自己的行,取决于我传递给它的值,还是会像这样作为所有面板的参考?@goomba454:每个新面板都有自己的变量和属性(除非您将其
共享
)。这就是
New
关键字的作用;实例化一个全新的、独立的面板实例。@goomba454:你可以给它一些属性,比如
X1
Y1
X2
Y2
。或者只是
点1
点2
。非常感谢你,这真是太棒了!!我真的很喜欢我t!我以前没有使用过AddHandler,所以我想现在是使用AddHandler的好时机!不过,一个简单的问题是,当您对运行时创建的控件使用AddHandler时,您还需要手动添加子MyPanel_Paint?@goomba454:是的,除非您使用运行时代码编译器来动态创建方法。如果您使用.NET 4.x,您还可以创建一个
Sub()
lambda,在这里可以将变量等传递给Paint事件(尽管删除事件订阅会更困难)。我以前没有使用过AddHandler,所以我想现在是使用AddHandler的好时机!不过,一个简单的问题是,当您对运行时创建的控件使用AddHandler时,您还需要手动添加子MyPanel_Paint?@goomba454:是的,除非您使用运行时代码编译器来动态创建方法。如果您使用.NET 4.x,您还可以创建一个
Sub()
lambda,在这里可以将变量等传递给Paint事件(尽管删除事件订阅会更困难)。