2016-10-02 8 views
0

BorderColorプロパティでラベルを作成しようとしましたが、動作しません。私はフォームアプリケーションでこのラベルのインスタントオブジェクトを作成し、BorderColorを変更しようとしますが、何も起こりません。 これは私のコードです:BorderColorプロパティでカスタムラベルを作成します。

Public Class MyLabel 
Inherits Label 

Private _BorderColor As Color 
Dim e As New PaintEventArgs(Me.CreateGraphics, Me.DisplayRectangle) 

Public Property BorderColor As Color 
    Get 
     Return _BorderColor 
    End Get 
    Set(value As Color) 
     _BorderColor = value 
     CreateBorder(value) 
    End Set 
End Property 

Private Sub CreateBorder(ByVal value As Color) 
    Dim g As Graphics = Me.CreateGraphics 
    Dim p As Pen = New Pen(value, 2) 
    g.DrawRectangle(p, Me.DisplayRectangle) 
End Sub 

Private Sub MyLabel_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint 
    CreateBorder(_BorderColor) 
End Sub 

エンドクラス

答えて

1

ノー、ノー、ダブルなし。 CreateGraphicsに電話しないでください。 GraphicsオブジェクトはPaintイベントによって提供され、それを使用します。また、Paintイベントをカスタムコントロールで処理するのではなく、OnPaintメソッドをオーバーライドします。さらに、図面を作成するメソッドがある場合(例: CreateBorderの場合は、OnPaintメソッド以外の場所から呼び出すことはできません。次のイベントでボーダーが再ペイントされるようにしたい場合は、Invalidateと呼んでください。例えば。

Public Class BorderedLabel 
    Inherits Label 

    Private _borderColor As Color 

    Property BorderColor As Color 
     Get 
      Return _borderColor 
     End Get 
     Set 
      _borderColor = Value 
      Invalidate() 
     End Set 
    End Property 

    Protected Overrides Sub OnPaint(e As PaintEventArgs) 
     MyBase.OnPaint(e) 

     Using p As New Pen(BorderColor, 2) 
      e.Graphics.DrawRectangle(p, DisplayRectangle) 
     End Using 
    End Sub 

End Class 
+0

...あなたも)PaintEventArgsの – Plutonix

+1

使用無効化を(変更しないでください、決してリフレッシュ()。 –

+0

@ HansPassant、アプリケーションコードでは、特に再ペイントが確実に行われるようにするには、 'Refresh'を呼び出すことが適切です。しかし、制御コードでは、おそらく 'Invalidate'がより適切であるということは間違いありません。私は上記の変更を行った。 – jmcilhinney

-1

おかげで...今それが機能 これは新しいコードです:

Public Class MyLabel 
Inherits Label 

Private _BorderColor As Color 
Private _BorderSize As Single = 1.0F 

Public Property BorderColor As Color 
    Get 
     Return _BorderColor 
    End Get 
    Set(value As Color) 
     _BorderColor = value 
     Refresh() 
    End Set 
End Property 

Public Property BorderSize As Single 
    Get 
     Return _BorderSize 
    End Get 
    Set(value As Single) 
     _BorderSize = value 
    End Set 
End Property 

Private Sub CreateBorder(ByVal value As Color, ByVal e As PaintEventArgs) 
    Dim g As Graphics = e.Graphics 
    Dim p As Pen = New Pen(value, _BorderSize) 
    g.DrawRectangle(p, Me.DisplayRectangle) 
End Sub 

Private Sub MyLabel_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint 
    CreateBorder(_BorderColor, e) 
End Sub 

エンドクラス

+0

これとジェムリヒニーの答えはほとんど違いがありません。あなたは助けに恵まれていて、その答えの隣にあるチェックマークをクリックする必要があります。 – Plutonix

+0

確かに、あなたは正しいですが、私はヘルプのチェックマークを見つけることができません。 –

関連する問題