2016-07-28 11 views
1

私はラベルを表すが、丸い角を持つカスタムコントロールを持っています。コントロールを作成して、デザイナーツールボックスからドラッグ&ドロップして、上端を丸めますが、テキストが消えてしまうようです。カスタムコントロールのテキストがありません

私は下部に表示されるテキストの別のカスタムプロパティを追加することができますが、テキストプロパティはすでに存在し、理想的には私はそれを使用したいと思います。私はオーバーライドプロパティを使ってそれを行うことができると思っていましたが、それはまだ表示されません。

任意の提案、私は...あなただけOnPaintオーバーライドしていないテキストに境界線を描画している

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 

おかげ

+0

テキストを描画しているようには見えません。 – Plutonix

+0

@Plutonix、私はそれがあなたが返事したことを知っていた!常にケースに:)。私は前にテキストを描いていましたが、塗りつぶされた矩形の下に角が丸くなっていました。少し遊んだ後、私はすべて一緒にテキストを失ったようです:/ –

答えて

1

を以下の私のコードをコピーしました。下の追加時:

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

これは、固定点3,3に描画しますが、あなたは(ToDoリスト)TextAlignプロパティに基づいて、または少なくともPadding値に基づいて位置を計算するためのコードを追加することもできます。

デザインタイムにテキストを変更するときにテキストを再描画する場合は、TextプロパティセッターにMe.Invalidate()も追加する必要があります。

+0

ありがとう!これは魅力的ですが、テキストアラインメントのためにいくつかのスペルコードがあった場合は素晴らしいでしょう。 :) –

+0

質問に答える場合は、チェックマークをクリックしupvoteしてください。 「連鎖する」質問は、コンテンツを非表示にするため、ここでうまく受信されません。 TextAlignの答えを探している人は、答えのために丸められたユーザーコントロールを探すとは思っていません。ただ別の質問をしてください。 – Plutonix

+0

良い点。ありがとうございました。質問は大きく回答しました。私はそれを回避してコードを書くことができました:o) –

関連する問題