2016-06-07 84 views
0

如何在刚创建的面板上绘制一条线?我使用我自己的类面板MyPanel,它和常规面板之间的唯一区别是我给它一个边框。在我的代码,这是我得到了什么:向新面板添加一个grapic.drawline

Dim newPanel as New MyPanel 

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

basePanel.controls.add(newPanel) 

该计划是要增加若干这些面板(其中每一个也许有点不同,我只想能够借鉴他们的一些线路,我可以稍后修改,或者只是清除并重新制作

因为我在代码中创建了这个面板,所以我无法访问_Paint事件,我认为这是上述代码工作的原因?

回答

2

一旦面板无效,CreateGraphics将一直被“擦除” 如果您使用自己的MyPanel类,那么您可以覆盖t他在它的方法并在该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个的对角线。

//被修改在

问候

+0

所以这样做,我仍然能够传递给它的值?如果我一个接一个地创建50个MyPanels,那么每个人都会拥有自己的行,而这些行依赖于我传递给它的值,或者这种类似的行为会成为他们的参考吗? – goomba454

+0

@ goomba454:每个新面板都会有自己的变量和属性(除非您将它们设为“共享”)。这就是'New'关键字的作用;实例化一个全新的,独立的面板实例。 –

+0

@ goomba454:你可以赋予它像'X1','Y1','X2'和'Y2'的属性。或者只是'Point1','Point2'。 –

0

的示例代码未示出你的线,因为只要将面板重绘线将不被包括在内。

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

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 
+0

我之前没有使用过AddHandler,所以我想现在是时候了!有一个简单的问题,当你在运行时创建的控件使用AddHandler时,你也可以手动添加Sub MyPanel_Paint? – goomba454

+0

@ goomba454:是的,除非您使用运行时代码编译器来动态地创建方法。如果你使用.NET 4.x,你也可以创建一个'Sub()'lambda,在那里你可以将变量等传递给Paint事件(尽管删除事件订阅将更加困难)。 –