2016-07-28 6 views
1

Ich habe ein benutzerdefiniertes Steuerelement, das ein Etikett darstellen soll, aber mit abgerundeten Ecken. Ich habe das Steuerelement so erstellt, dass es aus der Designer-Toolbox gezogen und gezogen wird, um die oberen Ecken zu runden, aber der Text scheint zu verschwinden.Custom Control Text fehlt

Ich weiß, dass ich eine weitere benutzerdefinierte Eigenschaft für den Text hinzufügen kann, die unten angezeigt wird, aber die Texteigenschaft ist bereits vorhanden und idealerweise möchte ich sie verwenden. Ich dachte, ich könnte es mit einer Override-Eigenschaft tun, aber in der Minute wird es immer noch nicht angezeigt.

Irgendwelche Vorschläge, habe ich meinen Code unten kopiert ...

Imports System.Windows.Forms.Design 
Imports System.Runtime.InteropServices 
Imports System.Drawing.Drawing2D 
Imports System.ComponentModel 

Public Class CustomControl 
    Inherits System.Windows.Forms.UserControl 
    Private m_Radius As Integer 
    Private m_BorderWidth As Integer 
    Private m_FillColor As Color 
    Private m_Text As String = Me.Text 
    Private m_Label As Label 

    Private components As System.ComponentModel.Container = Nothing 

    Public Sub New() 

     MyBase.BorderStyle = Windows.Forms.BorderStyle.None 
    End Sub 


    ''' <summary> 
    ''' Indicates a Radius of the control's corners 
    ''' </summary> 
    ''' <returns>The corner Radius.</returns> 
    Public Property Radius As Integer 
     Get 
      Return m_Radius 
     End Get 
     Set(value As Integer) 
      m_Radius = value 
     End Set 
    End Property 

    ''' <summary> 
    ''' Indicates the width to draw the outer border of the control. 
    ''' </summary> 
    ''' <returns>The border width.</returns> 
    Public Property BorderWidth As Integer 
     Get 
      Return m_BorderWidth 
     End Get 
     Set(value As Integer) 
      m_BorderWidth = value 
     End Set 
    End Property 

    ''' <summary> 
    ''' Indicates the outline colour of the control. 
    ''' </summary> 
    ''' <returns>The outline colour.</returns> 
    Public Property FillColor As Color 
     Get 
      Return m_FillColor 
     End Get 
     Set(value As Color) 
      m_FillColor = value 
     End Set 
    End Property 

    <Browsable(True), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> _ 
    Overrides Property Text() As String 
     Get 
      Return m_Text 
     End Get 
     Set(ByVal value As String) 
      m_Text = value 
      'This line just for update 
      'the UI when I design to check 
      'if the values are saved. 
      MyBase.Text = value 
     End Set 
    End Property 


    Protected Overrides Sub onPaint(e As PaintEventArgs) 
     Dim rect As Rectangle = Me.ClientRectangle 'Drawing Rounded Rectangle 
     rect.X = rect.X + 1 
     rect.Y = rect.Y + 1 
     rect.Width -= 2 
     rect.Height -= 2 

     Using bb As GraphicsPath = GetPath(rect, Radius) 
      'Draw the background 
      Using br As Brush = New SolidBrush(FillColor) 
       e.Graphics.SmoothingMode = SmoothingMode.HighQuality 
       e.Graphics.InterpolationMode = InterpolationMode.HighQualityBilinear 
       e.Graphics.FillPath(br, bb) 
      End Using 
      'Draw the border 
      Using br As Brush = New SolidBrush(Color.Black) 
       rect.Inflate(-1, -1) 
       e.Graphics.SmoothingMode = SmoothingMode.HighQuality 
       e.Graphics.InterpolationMode = InterpolationMode.HighQualityBilinear 
       e.Graphics.DrawPath(New Pen(br, BorderWidth), bb) 
      End Using 
     End Using 
    End Sub 

    Protected Function GetPath(ByVal rc As Rectangle, ByVal r As Int32) As GraphicsPath 
     Dim x As Int32 = rc.X, y As Int32 = rc.Y, w As Int32 = rc.Width - 1, h As Int32 = rc.Height - 1 
     r = r << 1 
     Dim path As GraphicsPath = New GraphicsPath() 
     If r > 0 Then 
      If (r > h) Then r = h 
      If (r > w) Then r = w 

      ' Top Left 
      path.AddArc(x, y, r, r, 180, 90) 

      ' Top Right 
      path.AddArc(x + w - r, y, r, r, 270, 90) 

      'Bottom Right 
      'path.AddArc(x + w - r, y + h - r, r, r, 0, 90) 
      path.AddLine(x + w, y + h, x + w, y + h) 

      ' Bottom Left 
      ' path.AddArc(x, y + h - r, r, r, 90, 90) 
      path.AddLine(x, y + h, x, y + h) 

      path.CloseFigure() 
     Else 
      path.AddRectangle(rc) 
     End If 
     Return path 
    End Function 

End Class 

Dank

+0

Es sieht nicht so aus, als ob Sie den Text zeichnen. – Plutonix

+0

@Plutonix, ich wusste, du würdest antworten! Immer auf dem Fall :). Ich hatte die Textzeichnung vorher, aber unter dem gemalten Rechteck mit den abgerundeten Ecken. Nachdem ich ein bisschen herumgespielt habe, habe ich den Text anscheinend alle zusammen verloren:/ –

Antwort

1

Sie zeichnen nur die Grenzen in der OnPaint überschreiben und nicht der Text. Am unteren add:

TextRenderer.DrawText(e.Graphics, m_Text, Me.Font, 
        New Point(3, 3), Me.ForeColor) 

Dies zieht an den festen Punkt 3,3, aber Sie können Code hinzufügen, um die Lage zu berechnen, basierend auf einer TextAlign Eigenschaft (ToDo) oder zumindest auf der Grundlage der Padding Werte.

Wenn Sie möchten, dass der Text zur Entwurfszeit neu gezeichnet wird, wenn Sie ihn ändern, müssen Sie auch dem Eigenschaftensatz hinzufügen.

+0

Danke! Das ist ein Glücksfall, aber es wäre toll, wenn du zufällig etwas Code übrig hättest, der für den Text Align sorgt. :) –

+0

Wenn es die Frage beantwortet, klicken Sie bitte das Häkchen und upvote es. "Chaining" -Fragen werden hier nicht gut aufgenommen, weil sie Inhalte verbergen. Jemand anderes, der nach TextAlign-Antworten sucht, wird nicht daran denken, nach abgerundeten Benutzersteuerelementen für die Antwort zu suchen. Stellen Sie einfach eine andere Frage. – Plutonix

+0

Guter Punkt. Vielen Dank, die Frage ist sehr gut beantwortet und ich habe es geschafft, es zu umgehen und dafür zu programmieren: o) –