SFLabel

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von JLH.

    Ich würde gerne das "SFLabel" von ErfinderdesRades verwenden um Labels 90° zu drehen. Ich habe den Code kopiert, in meinem bestehenden Projekt eine Klasse erstellt und eingefügt. Jetzt bekomme ich bei folgenden zwei Zeilen die Meldung
    " "Assign" ist kein Member von "Color" ". Leider reichen meine Kenntnisse nicht aus um den Fehler zu beheben. Kann jemand helfen?

    Das SFLabel hab ich von hier: Vertikale Labels

    VB.NET-Quellcode

    1. ​_ForeBrush.Color.Assign(MyBase.ForeColor)
    2. _BackBrush.Color.Assign(MyBase.BackColor)
    Der Code ist von ErfinderdesRades... ich glaube nicht, daß er Code veröffentlicht den er nicht getestet hat. Ich habe alles verglichen und keinen Unterschied beim Kopieren gefunden. Kann es ein Fehler sein weil der Code schon etwas älter ist?
    Das ist eine Klasse.Fügst deinem Projekt eine Klasse hinzu, benennst sie bitte SFLabel, und kopierst den Code rein.Dann ist das Ding im Projekt verfügbar - inne Toolbox.

    Was für eine Falle, welche Extension? Tut mir Leid wenn jetzt nichts verstehe.. Es gibt hier irgendwo die "_Tests01.zip". Da enthalten ist auch der code als "SFLabel.vb" und der läuft auch nicht.
    @JLH Wenn das ein Brush werden soll, probier einfach mal

    VB.NET-Quellcode

    1. _ForeBrush = New Brush(MyBase.ForeColor)
    2. _BackBrush = New Brush(MyBase.BackColor)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. Imports System.Drawing
    2. Imports System.ComponentModel
    3. ''' <summary>
    4. ''' Dieses Controls Beschriftung läßt sich durch Veränderung seiner
    5. ''' CaptionStringFormat-Property manipulieren
    6. ''' </summary>
    7. <DebuggerDisplay("{txt}")>
    8. <DesignerCategory("Code")>
    9. Public Class SFLabel : Inherits Control
    10. Private ReadOnly _CaptionStringFormat As StringFormat = New StringFormat
    11. Private _ForeBrush As New SolidBrush(Color.Black)
    12. Private _BackBrush As New SolidBrush(Color.White)
    13. Public Sub New()
    14. Me.SetStyle(ControlStyles.ResizeRedraw, True)
    15. MyBase.BackColor = Color.Gainsboro
    16. End Sub
    17. Public Overrides Property ForeColor As Drawing.Color
    18. Get
    19. Return _ForeBrush.Color
    20. End Get
    21. Set(value As Color)
    22. _ForeBrush.Color = value
    23. End Set
    24. End Property
    25. Private Function txt() As String
    26. Return Text
    27. End Function
    28. Protected Overloads Overrides Sub Dispose(disposing As Boolean)
    29. If Not MyBase.IsDisposed Then
    30. For Each D As IDisposable In New IDisposable() {_ForeBrush, _BackBrush, _CaptionStringFormat}
    31. D.Dispose()
    32. Next
    33. End If
    34. MyBase.Dispose(disposing)
    35. End Sub
    36. 'Einstellung: Im Designer den Knoten der Property "CaptionStringFormat" erweitern, und Einstellungen vornehmen
    37. 'Es kann das vertikale und horizontale Alignment bestimmt werden, ob der Text umgebrochen wird (FormatFlags), welche Zeichen gekürzt werden, wenn der Text zu lang ist (Trimming)
    38. 'Die Änderungen sind sofort sichtbar - kein Kompilieren erforderlich
    39. <TypeConverter(GetType(ExpandableObjectConverter))>
    40. <Browsable(True)>
    41. <Category("Darstellung")>
    42. <Description("Einige interessante Einstellmöglichkeiten der Schrift-Darstellung")>
    43. <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)>
    44. Public ReadOnly Property CaptionStringFormat() As StringFormat
    45. Get
    46. If Me.DesignMode Then Invalidate()
    47. Return _CaptionStringFormat
    48. End Get
    49. End Property
    50. Protected Overrides Sub OnTextChanged(e As System.EventArgs)
    51. MyBase.OnTextChanged(e)
    52. Invalidate()
    53. End Sub
    54. Private _BorderStyle As Border3DStyle = Border3DStyle.Adjust
    55. <DefaultValue(GetType(Border3DStyle), "Adjust")>
    56. <Category("Darstellung")>
    57. Public Property BorderStyle() As Border3DStyle
    58. Get
    59. Return _BorderStyle
    60. End Get
    61. Set(NewValue As Border3DStyle)
    62. If Object.Equals(NewValue, Me.BorderStyle) Then Return
    63. _BorderStyle = NewValue
    64. End Set
    65. End Property
    66. Protected Overrides Sub OnPaint(e As PaintEventArgs)
    67. _ForeBrush.Color.Assign(MyBase.ForeColor)
    68. _BackBrush.Color.Assign(MyBase.BackColor)
    69. e.Graphics.FillRectangle(_BackBrush, ClientRectangle)
    70. e.Graphics.DrawString(MyBase.Text, MyBase.Font, _ForeBrush, ClientRectangle, _CaptionStringFormat)
    71. ControlPaint.DrawBorder3D(e.Graphics, ClientRectangle, _BorderStyle)
    72. MyBase.OnPaint(e)
    73. End Sub
    74. End Class


    Da sich die Farbe des Labels nicht ändert (ich habe die beiden Zeilen auskommentiert) gehe ich davon aus, daß die Zeilen die Hinter- und Vordergrundfarbe des Labels ändern sollen.
    Rod, Dein Tipp hat nicht funktioniert.


    Hab's gefunden! Danke Rod...

    VB.NET-Quellcode

    1. _ForeBrush.Color = (MyBase.ForeColor)
    2. _BackBrush.Color = (MyBase.BackColor)



    @ErfinderdesRades... solltest Du dies sehen und es nicht zuviel des Guten ist, kann man den Vertikalen Text von unten nach oben statt von oben nach unten anzeigen lassen? Also den Text um 180° drehen?

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „JLH“ ()

    JLH schrieb:

    ErfinderdesRades... solltest Du dies sehen
    Du könntest die Wahrscheinlichkeit deutlich erhöhen, wenn Du ihn per @-Zeichen und der damit verbundenen Ansprechfunktion (Stichwort @JLH - schwupps, hast Du ne Nachricht in Deinem Posteingang, dass ich Dich erwähnt habe) darüber in Kenntnis setzen würdest.
    Die Assign-Extensions ist garantiert eine von ihm selbst gebaute, die in seinen Helpers-Zusatzprojekten drinsteckt. Die hat er so oft erwähnt und bestimmt auch hochgeladen, dass Du nach 2 Minuten Recherche im Forum selber den Quellcode findest.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    JLH schrieb:

    Es gibt hier irgendwo die "_Tests01.zip". Da enthalten ist auch der code als "SFLabel.vb" und der läuft auch nicht
    Das stimmt nicht, in dem Testprojekt läuft das, du hast die Extension also nicht mit übernommen, vermutlich dort auch nur den SFLabel-Code rauskopiert.

    Das ein Testprojekt dabei war habe ich aber erst gar nicht gesehen.

    JLH schrieb:

    welche Extension
    die Assign-Funktion im ObjectX-Modul

    JLH schrieb:


    VB.NET-Quellcode

    1. _ForeBrush.Color.Assign(MyBase.ForeColor)
    2. _BackBrush.Color.Assign(MyBase.BackColor)
    Jo, dassis eine kleine Extension.
    Ohne Extension:

    VB.NET-Quellcode

    1. If ForeBrush.Color <> MyBase.ForeColor Then ForeBrush.Color = MyBase.ForeColor

    Aber das hätte man auch rauskriegen können, indem man den Code mal debugt. Also Haltepunkt auf die Zeile setzen, und mit F11 durchsteppen, was sich da ereignet.
    Eventuell gibts da auch Doku-Kommentare zum Nachlesen.

    Falls es an Debugging-Fertigkeiten fehlt (ist ja nichts verwerfliches) - hier Video-Tut: VisualStudio richtig nutzen (Google ist nicht deine Mami)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Offensichtlich funktioniert DirectionRightToLeft des StringFormats nicht richtig. Zumindest würde ich es so verstehen, dass das den Text spiegelt. Stattdessen wird er nur rechtsbündig. Oder sehe ich das verkehrt?

    Du könntest durch Transformation der Graphics den Text drehen, das kann aber schnell ausarten, je nachdem was du genau brauchst.

    VB.NET-Quellcode

    1. e.Graphics.TranslateTransform(20, 50)
    2. e.Graphics.ScaleTransform(-1, -1)

    @JLH Ich habe ein C#-Control gefunden, die das alles macht:
    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.ComponentModel;
    3. using System.Drawing;
    4. using System.Drawing.Text;
    5. using System.Windows.Forms;
    6. namespace WindowsFormsApp2
    7. {
    8. /// <summary>
    9. /// A custom windows control to display text vertically
    10. /// </summary>
    11. [DefaultProperty("Text")]
    12. [DefaultBindingProperty("Text")]
    13. public class VerticalLabel
    14. : Control
    15. {
    16. #region Constants
    17. private static readonly ContentAlignment AnyBottom = (ContentAlignment)0x700;
    18. private static readonly ContentAlignment AnyMiddle = (ContentAlignment)0x70;
    19. private static readonly ContentAlignment AnyRight = (ContentAlignment)0x444;
    20. private static readonly ContentAlignment AnyCenter = (ContentAlignment)0x222;
    21. #endregion Constants
    22. #region Enum
    23. /// <summary>
    24. /// Text Drawing Direction
    25. /// </summary>
    26. public enum DrawDirections
    27. {
    28. /// <summary>
    29. /// Text is drawn from bottom - up
    30. /// </summary>
    31. BottomUp,
    32. /// <summary>
    33. /// Text is drawn from top to bottom
    34. /// </summary>
    35. TopBottom,
    36. }
    37. #endregion Enum
    38. #region Properties
    39. /// <summary>
    40. /// Graphics rendering mode. Supprot for antialiasing.
    41. /// </summary>
    42. [Category("Properties"), Description("Rendering hint.")]
    43. public TextRenderingHint RenderingHint { get; set; }
    44. /// <summary>
    45. /// The text to be displayed in the control
    46. /// </summary>
    47. [Category("VerticalLabel"), Description("Text is displayed vertically in container.")]
    48. public override string Text
    49. {
    50. get { return this._Text; }
    51. set
    52. {
    53. this._Text = value;
    54. this.Invalidate();
    55. }
    56. }
    57. /// <summary>
    58. ///
    59. /// </summary>
    60. [Category("Properties"), Description("Whether the text will be drawn from Bottom or from Top.")]
    61. public DrawDirections DrawDirection { get; set; }
    62. /// <summary>
    63. ///
    64. /// </summary>
    65. [Category("Properties"), Description("Whether the text will be drawn with transparent background or not.")]
    66. public bool Transparency { get; set; }
    67. /// <summary>Ruft die Textausrichtung im Label ab oder legt diese fest.</summary>
    68. /// <returns>Einer der <see cref="T:System.Drawing.ContentAlignment" />-Werte.Der Standardwert ist <see cref="F:System.Drawing.ContentAlignment.TopLeft" />.</returns>
    69. /// <exception cref="T:System.ComponentModel.InvalidEnumArgumentException">Der zugewiesene Wert ist keiner der <see cref="T:System.Drawing.ContentAlignment" />-Werte. </exception>
    70. [Localizable(true)]
    71. [DefaultValue(ContentAlignment.TopLeft)]
    72. public ContentAlignment TextAlign { get; set; }
    73. /// <summary>Ruft die Rahmenart des Steuerelements ab oder legt diese fest.</summary>
    74. /// <returns>Einer der <see cref="T:System.Windows.Forms.BorderStyle" />-Werte.Der Standardwert ist BorderStyle.None.</returns>
    75. /// <exception cref="T:System.ComponentModel.InvalidEnumArgumentException">Der zugewiesene Wert ist keiner der <see cref="T:System.Windows.Forms.BorderStyle" />-Werte. </exception>
    76. [DefaultValue(BorderStyle.None)]
    77. public BorderStyle BorderStyle { get; set; }
    78. /// <summary>
    79. /// v1.10
    80. /// </summary>
    81. protected override CreateParams CreateParams
    82. {
    83. get
    84. {
    85. CreateParams cp = base.CreateParams;
    86. // Turn on WS_EX_TRANSPARENT
    87. cp.ExStyle |= 0x20;
    88. // this.UseMnemonic = false
    89. cp.Style |= 0x80;
    90. switch (this.TextAlign)
    91. {
    92. case ContentAlignment.TopLeft:
    93. case ContentAlignment.MiddleLeft:
    94. case ContentAlignment.BottomLeft:
    95. cp.Style |= 0;
    96. break;
    97. case ContentAlignment.TopCenter:
    98. case ContentAlignment.MiddleCenter:
    99. case ContentAlignment.BottomCenter:
    100. cp.Style |= 1;
    101. break;
    102. case ContentAlignment.TopRight:
    103. case ContentAlignment.MiddleRight:
    104. case ContentAlignment.BottomRight:
    105. cp.Style |= 2;
    106. break;
    107. }
    108. switch (this.BorderStyle)
    109. {
    110. case BorderStyle.FixedSingle:
    111. cp.Style |= 0x800000;
    112. break;
    113. case BorderStyle.Fixed3D:
    114. cp.Style |= 0x1000;
    115. break;
    116. }
    117. return cp;
    118. }
    119. }
    120. #endregion Properties
    121. #region Member
    122. /// <summary>
    123. /// Der Label-Text
    124. /// </summary>
    125. private string _Text;
    126. #endregion Member
    127. #region Construktor
    128. /// <summary>
    129. /// VerticalLabel constructor
    130. /// </summary>
    131. public VerticalLabel()
    132. {
    133. this.DrawDirection = DrawDirections.BottomUp;
    134. this.Transparency = false;
    135. this.RenderingHint = TextRenderingHint.SystemDefault;
    136. this.TextAlign = ContentAlignment.TopLeft;
    137. this.CreateControl();
    138. this.Size = new Size(24, 100);
    139. this.SetStyle(ControlStyles.Opaque, true);
    140. }
    141. #endregion Construktor
    142. #region Methods
    143. /// <summary>
    144. /// OnPaint override. This is where the text is rendered vertically.
    145. /// </summary>
    146. protected override void OnPaint(PaintEventArgs e)
    147. {
    148. base.OnPaint(e);
    149. Pen backPen = null;
    150. Brush backBrush = null;
    151. try
    152. {
    153. backBrush = this.Transparency ? new SolidBrush(Color.Empty) : new SolidBrush(base.BackColor);
    154. backPen = new Pen(backBrush, 0);
    155. Rectangle rect = DeflateRect(this.ClientRectangle, this.Padding);
    156. // Halb-Rahmen oben links
    157. e.Graphics.DrawRectangle(backPen, this.ClientRectangle);
    158. // die Fläche
    159. e.Graphics.FillRectangle(backBrush, this.ClientRectangle);
    160. e.Graphics.TextRenderingHint = this.RenderingHint;
    161. e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
    162. using (Brush brush = new SolidBrush(base.ForeColor))
    163. {
    164. if (this.DrawDirection == DrawDirections.BottomUp)
    165. {
    166. // Koordinatensystem verschieben und drehen
    167. e.Graphics.TranslateTransform(0, this.Height);
    168. e.Graphics.RotateTransform(270);
    169. PointF pt = this.CalcLocation(e.Graphics, rect);
    170. e.Graphics.DrawString(this._Text, this.Font, brush, pt.X, pt.Y, StringFormat.GenericDefault);
    171. }
    172. else
    173. {
    174. // Koordinatensystem verschieben und drehen
    175. e.Graphics.TranslateTransform(this.Width, 0);
    176. e.Graphics.RotateTransform(90);
    177. PointF pt = this.CalcLocation(e.Graphics, rect);
    178. e.Graphics.DrawString(this._Text, this.Font, brush, pt.X, pt.Y, StringFormat.GenericTypographic);
    179. }
    180. }
    181. }
    182. finally
    183. {
    184. backPen.Dispose();
    185. backBrush.Dispose();
    186. }
    187. }
    188. /// <summary>
    189. /// OnResize override
    190. /// </summary>
    191. protected override void OnResize(EventArgs e)
    192. {
    193. this.Invalidate();
    194. }
    195. /// <summary>
    196. /// von Label abgeschrieben und präzisiert
    197. /// </summary>
    198. /// <param name="rc">das Client-Rectangle</param>
    199. /// <param name="pad">das Padding</param>
    200. /// <returns></returns>
    201. private static Rectangle DeflateRect(Rectangle rc, Padding pad)
    202. {
    203. Rectangle rect = new Rectangle(rc.Location, rc.Size);
    204. rect.X += pad.Left;
    205. rect.Y += pad.Top;
    206. rect.Width -= pad.Horizontal;
    207. rect.Height -= pad.Vertical;
    208. return rect;
    209. }
    210. /// <summary>
    211. /// Berechnung der Startposition des Textes
    212. /// im transformierten Context
    213. /// </summary>
    214. /// <param name="g">der Graphics-Context nach Transform</param>
    215. /// <param name="rect">ClientRect mit Padding</param>
    216. /// <returns></returns>
    217. private PointF CalcLocation(Graphics g, Rectangle rect)
    218. {
    219. // der Rand rechts und unten
    220. SizeF sz = g.MeasureString(this._Text, this.Font);
    221. SizeF size = SizeF.Empty;
    222. size.Height = rect.Width - sz.Height;
    223. size.Width = rect.Height - sz.Width;
    224. PointF pt = rect.Location;
    225. if (this.TextAlign.HasFlag(AnyRight))
    226. {
    227. pt.X += size.Width;
    228. }
    229. if (this.TextAlign.HasFlag(AnyCenter))
    230. {
    231. pt.X += size.Width / 2F;
    232. }
    233. if (this.TextAlign.HasFlag(AnyBottom))
    234. {
    235. pt.Y += size.Height;
    236. }
    237. if (this.TextAlign.HasFlag(AnyMiddle))
    238. {
    239. pt.Y += size.Height / 2F;
    240. }
    241. return pt;
    242. }
    243. #endregion Methods
    244. }
    245. }
    Mit dem Telerik kommt das raus (ungetestet):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.ComponentModel
    3. Imports System.Drawing
    4. Imports System.Drawing.Text
    5. Imports System.Windows.Forms
    6. Namespace WindowsFormsApp2
    7. <DefaultProperty("Text")>
    8. <DefaultBindingProperty("Text")>
    9. Public Class VerticalLabel
    10. Inherits Control
    11. Private Shared ReadOnly AnyBottom As ContentAlignment = CType(&H700, ContentAlignment)
    12. Private Shared ReadOnly AnyMiddle As ContentAlignment = CType(&H70, ContentAlignment)
    13. Private Shared ReadOnly AnyRight As ContentAlignment = CType(&H444, ContentAlignment)
    14. Private Shared ReadOnly AnyCenter As ContentAlignment = CType(&H222, ContentAlignment)
    15. Public Enum DrawDirections
    16. BottomUp
    17. TopBottom
    18. End Enum
    19. <Category("Properties"), Description("Rendering hint.")>
    20. Public Property RenderingHint As TextRenderingHint
    21. <Category("VerticalLabel"), Description("Text is displayed vertically in container.")>
    22. Public Overrides Property Text As String
    23. Get
    24. Return Me._Text
    25. End Get
    26. Set(ByVal value As String)
    27. Me._Text = value
    28. Me.Invalidate()
    29. End Set
    30. End Property
    31. <Category("Properties"), Description("Whether the text will be drawn from Bottom or from Top.")>
    32. Public Property DrawDirection As DrawDirections
    33. <Category("Properties"), Description("Whether the text will be drawn with transparent background or not.")>
    34. Public Property Transparency As Boolean
    35. <Localizable(True)>
    36. <DefaultValue(ContentAlignment.TopLeft)>
    37. Public Property TextAlign As ContentAlignment
    38. <DefaultValue(BorderStyle.None)>
    39. Public Property BorderStyle As BorderStyle
    40. Protected Overrides ReadOnly Property CreateParams As CreateParams
    41. Get
    42. Dim cp As CreateParams = MyBase.CreateParams
    43. cp.ExStyle = cp.ExStyle Or &H20
    44. cp.Style = cp.Style Or &H80
    45. Select Case Me.TextAlign
    46. Case ContentAlignment.TopLeft, ContentAlignment.MiddleLeft, ContentAlignment.BottomLeft
    47. cp.Style = cp.Style Or 0
    48. Case ContentAlignment.TopCenter, ContentAlignment.MiddleCenter, ContentAlignment.BottomCenter
    49. cp.Style = cp.Style Or 1
    50. Case ContentAlignment.TopRight, ContentAlignment.MiddleRight, ContentAlignment.BottomRight
    51. cp.Style = cp.Style Or 2
    52. End Select
    53. Select Case Me.BorderStyle
    54. Case BorderStyle.FixedSingle
    55. cp.Style = cp.Style Or &H800000
    56. Case BorderStyle.Fixed3D
    57. cp.Style = cp.Style Or &H1000
    58. End Select
    59. Return cp
    60. End Get
    61. End Property
    62. Private _Text As String
    63. Public Sub New()
    64. Me.DrawDirection = DrawDirections.BottomUp
    65. Me.Transparency = False
    66. Me.RenderingHint = TextRenderingHint.SystemDefault
    67. Me.TextAlign = ContentAlignment.TopLeft
    68. Me.CreateControl()
    69. Me.Size = New Size(24, 100)
    70. Me.SetStyle(ControlStyles.Opaque, True)
    71. End Sub
    72. Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
    73. MyBase.OnPaint(e)
    74. Dim backPen As Pen = Nothing
    75. Dim backBrush As Brush = Nothing
    76. Try
    77. backBrush = If(Me.Transparency, New SolidBrush(Color.Empty), New SolidBrush(MyBase.BackColor))
    78. backPen = New Pen(backBrush, 0)
    79. Dim rect As Rectangle = DeflateRect(Me.ClientRectangle, Me.Padding)
    80. e.Graphics.DrawRectangle(backPen, Me.ClientRectangle)
    81. e.Graphics.FillRectangle(backBrush, Me.ClientRectangle)
    82. e.Graphics.TextRenderingHint = Me.RenderingHint
    83. e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality
    84. Using brush As Brush = New SolidBrush(MyBase.ForeColor)
    85. If Me.DrawDirection = DrawDirections.BottomUp Then
    86. e.Graphics.TranslateTransform(0, Me.Height)
    87. e.Graphics.RotateTransform(270)
    88. Dim pt As PointF = Me.CalcLocation(e.Graphics, rect)
    89. e.Graphics.DrawString(Me._Text, Me.Font, brush, pt.X, pt.Y, StringFormat.GenericDefault)
    90. Else
    91. e.Graphics.TranslateTransform(Me.Width, 0)
    92. e.Graphics.RotateTransform(90)
    93. Dim pt As PointF = Me.CalcLocation(e.Graphics, rect)
    94. e.Graphics.DrawString(Me._Text, Me.Font, brush, pt.X, pt.Y, StringFormat.GenericTypographic)
    95. End If
    96. End Using
    97. Finally
    98. backPen.Dispose()
    99. backBrush.Dispose()
    100. End Try
    101. End Sub
    102. Protected Overrides Sub OnResize(ByVal e As EventArgs)
    103. Me.Invalidate()
    104. End Sub
    105. Private Shared Function DeflateRect(ByVal rc As Rectangle, ByVal pad As Padding) As Rectangle
    106. Dim rect As Rectangle = New Rectangle(rc.Location, rc.Size)
    107. rect.X += pad.Left
    108. rect.Y += pad.Top
    109. rect.Width -= pad.Horizontal
    110. rect.Height -= pad.Vertical
    111. Return rect
    112. End Function
    113. Private Function CalcLocation(ByVal g As Graphics, ByVal rect As Rectangle) As PointF
    114. Dim sz As SizeF = g.MeasureString(Me._Text, Me.Font)
    115. Dim size As SizeF = SizeF.Empty
    116. size.Height = rect.Width - sz.Height
    117. size.Width = rect.Height - sz.Width
    118. Dim pt As PointF = rect.Location
    119. If Me.TextAlign.HasFlag(AnyRight) Then
    120. pt.X += size.Width
    121. End If
    122. If Me.TextAlign.HasFlag(AnyCenter) Then
    123. pt.X += size.Width / 2F
    124. End If
    125. If Me.TextAlign.HasFlag(AnyBottom) Then
    126. pt.Y += size.Height
    127. End If
    128. If Me.TextAlign.HasFlag(AnyMiddle) Then
    129. pt.Y += size.Height / 2F
    130. End If
    131. Return pt
    132. End Function
    133. End Class
    134. End Namespace
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!