2016-06-07 85 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事件(儘管刪除事件訂閱將更加困難)。 –