Eigene Textbox hat rechts und unten dickeren Border als oben und links

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

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Eigene Textbox hat rechts und unten dickeren Border als oben und links

    Halöchen,

    während ich immer noch an meinem hübschen Projekt arbeite, wollte ich noch nebenbei ein schönes, flaches Design erstellen. Aktuell habe ich jedoch das Problem mit einer Textbox, welche rechts und unten zu dicke Borders hat.



    Das sieht für mich so aus, als wäre der Borderstyle falsch gesetzt, aber ich habe kein Borderstyle in meinem Code gesetzt.
    Ich habe dann mal diesen Code eingefügt:

    VB.NET-Quellcode

    1. ​TB.BorderStyle = BorderStyle.None

    Jedoch habe ich weiterhin rechts und unten dickere Borders.

    Muss ich da vielleicht noch etwas beachten?

    Das hier steht bei mir im OnCreateControl:

    VB.NET-Quellcode

    1. Protected Overrides Sub OnCreateControl()
    2. MyBase.OnCreateControl()
    3. If Not Controls.Contains(TB) Then
    4. Controls.Add(TB)
    5. End If
    6. TB.BorderStyle = BorderStyle.None
    7. End Sub
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. <DefaultEvent("TextChanged")> Class FlatTextBox : Inherits Control
    2. #Region " Variables"
    3. Private W, H As Integer
    4. Private State As MouseState = MouseState.None
    5. Private WithEvents TB As System.Windows.Forms.TextBox
    6. #End Region
    7. #Region " Properties"
    8. #Region " TextBox Properties"
    9. Private _TextAlign As HorizontalAlignment = HorizontalAlignment.Left
    10. <Category("Options")>
    11. Property TextAlign() As HorizontalAlignment
    12. Get
    13. Return _TextAlign
    14. End Get
    15. Set(ByVal value As HorizontalAlignment)
    16. _TextAlign = value
    17. If TB IsNot Nothing Then
    18. TB.TextAlign = value
    19. End If
    20. End Set
    21. End Property
    22. Private _MaxLength As Integer = 32767
    23. <Category("Options")>
    24. Property MaxLength() As Integer
    25. Get
    26. Return _MaxLength
    27. End Get
    28. Set(ByVal value As Integer)
    29. _MaxLength = value
    30. If TB IsNot Nothing Then
    31. TB.MaxLength = value
    32. End If
    33. End Set
    34. End Property
    35. Private _ReadOnly As Boolean
    36. <Category("Options")>
    37. Property [ReadOnly]() As Boolean
    38. Get
    39. Return _ReadOnly
    40. End Get
    41. Set(ByVal value As Boolean)
    42. _ReadOnly = value
    43. If TB IsNot Nothing Then
    44. TB.ReadOnly = value
    45. End If
    46. End Set
    47. End Property
    48. Private _UseSystemPasswordChar As Boolean
    49. <Category("Options")>
    50. Property UseSystemPasswordChar() As Boolean
    51. Get
    52. Return _UseSystemPasswordChar
    53. End Get
    54. Set(ByVal value As Boolean)
    55. _UseSystemPasswordChar = value
    56. If TB IsNot Nothing Then
    57. TB.UseSystemPasswordChar = value
    58. End If
    59. End Set
    60. End Property
    61. Private _Multiline As Boolean
    62. <Category("Options")>
    63. Property Multiline() As Boolean
    64. Get
    65. Return _Multiline
    66. End Get
    67. Set(ByVal value As Boolean)
    68. _Multiline = value
    69. If TB IsNot Nothing Then
    70. TB.Multiline = value
    71. If value Then
    72. TB.Height = Height - 11
    73. Else
    74. Height = TB.Height + 11
    75. End If
    76. End If
    77. End Set
    78. End Property
    79. <Category("Options")>
    80. Overrides Property Text As String
    81. Get
    82. Return MyBase.Text
    83. End Get
    84. Set(ByVal value As String)
    85. MyBase.Text = value
    86. If TB IsNot Nothing Then
    87. TB.Text = value
    88. End If
    89. End Set
    90. End Property
    91. <Category("Options")>
    92. Overrides Property Font As Font
    93. Get
    94. Return MyBase.Font
    95. End Get
    96. Set(ByVal value As Font)
    97. MyBase.Font = value
    98. If TB IsNot Nothing Then
    99. TB.Font = value
    100. TB.Location = New Point(3, 5)
    101. TB.Width = Width - 6
    102. If Not _Multiline Then
    103. Height = TB.Height + 11
    104. End If
    105. End If
    106. End Set
    107. End Property
    108. Protected Overrides Sub OnCreateControl()
    109. MyBase.OnCreateControl()
    110. If Not Controls.Contains(TB) Then
    111. Controls.Add(TB)
    112. End If
    113. TB.BorderStyle = BorderStyle.None
    114. End Sub
    115. Private Sub OnBaseTextChanged(ByVal s As Object, ByVal e As EventArgs)
    116. Text = TB.Text
    117. End Sub
    118. Private Sub OnBaseKeyDown(ByVal s As Object, ByVal e As KeyEventArgs)
    119. If e.Control AndAlso e.KeyCode = Keys.A Then
    120. TB.SelectAll()
    121. e.SuppressKeyPress = True
    122. End If
    123. If e.Control AndAlso e.KeyCode = Keys.C Then
    124. TB.Copy()
    125. e.SuppressKeyPress = True
    126. End If
    127. End Sub
    128. Protected Overrides Sub OnResize(ByVal e As EventArgs)
    129. TB.Location = New Point(5, 5)
    130. TB.Width = Width - 10
    131. If _Multiline Then
    132. TB.Height = Height - 11
    133. Else
    134. Height = TB.Height + 11
    135. End If
    136. MyBase.OnResize(e)
    137. End Sub
    138. #End Region
    139. #Region " Colors"
    140. <Category("Colors")>
    141. Public Property TextColor As Color
    142. Get
    143. Return _TextColor
    144. End Get
    145. Set(value As Color)
    146. _TextColor = value
    147. End Set
    148. End Property
    149. Public Overrides Property ForeColor() As Color
    150. Get
    151. Return _TextColor
    152. End Get
    153. Set(value As Color)
    154. _TextColor = value
    155. End Set
    156. End Property
    157. #End Region
    158. #End Region
    159. #Region " Colors"
    160. Private _BaseColor As Color = Color.FromArgb(30, 39, 44)
    161. Private _TextColor As Color = Color.FromArgb(192, 192, 192)
    162. Private _BorderColor As Color = Color.FromArgb(85, 117, 140)
    163. #End Region
    164. Sub New()
    165. SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint Or
    166. ControlStyles.ResizeRedraw Or ControlStyles.OptimizedDoubleBuffer Or
    167. ControlStyles.SupportsTransparentBackColor, True)
    168. DoubleBuffered = True
    169. BackColor = Color.Transparent
    170. TB = New System.Windows.Forms.TextBox
    171. TB.Font = New Font("Segoe UI", 10)
    172. TB.Text = Text
    173. TB.BackColor = _BaseColor
    174. TB.ForeColor = _TextColor
    175. TB.MaxLength = _MaxLength
    176. TB.Multiline = _Multiline
    177. TB.ReadOnly = _ReadOnly
    178. TB.UseSystemPasswordChar = _UseSystemPasswordChar
    179. TB.BorderStyle = BorderStyle.None
    180. TB.Location = New Point(5, 5)
    181. TB.Width = Width - 10
    182. TB.Cursor = Cursors.IBeam
    183. If _Multiline Then
    184. TB.Height = Height - 11
    185. Else
    186. Height = TB.Height + 11
    187. End If
    188. AddHandler TB.TextChanged, AddressOf OnBaseTextChanged
    189. AddHandler TB.KeyDown, AddressOf OnBaseKeyDown
    190. End Sub
    191. Protected Overrides Sub OnPaint(e As PaintEventArgs)
    192. B = New Bitmap(Width, Height) : G = Graphics.FromImage(B)
    193. W = Width - 1 : H = Height - 1
    194. Dim Base As New Rectangle(0, 0, W, H)
    195. With G
    196. .SmoothingMode = 2
    197. .PixelOffsetMode = 2
    198. .TextRenderingHint = 5
    199. .Clear(BackColor)
    200. '-- Colors
    201. TB.BackColor = _BaseColor
    202. TB.ForeColor = _TextColor
    203. '-- Base
    204. .FillRectangle(New SolidBrush(_BaseColor), Base)
    205. '-- Border
    206. .DrawRectangle(New Pen(_BorderColor), Base)
    207. End With
    208. MyBase.OnPaint(e)
    209. G.Dispose()
    210. e.Graphics.InterpolationMode = 7
    211. e.Graphics.DrawImageUnscaled(B, 0, 0)
    212. B.Dispose()
    213. End Sub



    Das hier wäre der Code. Den habe ich nicht selber geschrieben, ich habe nur die Farben verändert und einen Border hinzugefügt(ich habe es mit --Border unten im Code markiert)

    Ich glaube, dass es hier dran liegt:

    VB.NET-Quellcode

    1. .SmoothingMode = 2
    2. .PixelOffsetMode = 2
    3. .TextRenderingHint = 5
    4. .Clear(BackColor)


    Ich habe bereits mit dem .PixelOffsetMode gespielt und ihn auf 0 gesetzt, aber da tut sich rein gar nichts. Ich könnte schwören, dass es der PixelOffsetMode ist.


    //Edit:
    Ich habe grade den PixelOffsetMode nochmal auf 0 gesetzt und es hat diesmal geklappt. Ich habe manchmal in Visual Studio einen Fehler, dass egal was ich im Code ändere, nichts lässt sich speichern. Einmal neustarten reicht in der Regel, aber ich habe damit gar nicht gerechnet. Hätte ich einen Button eingefügt, hätte ich sicherlich bemerkt, dass es an dem Fehler liegt.

    @VB1963
    Als Du meintest, dass es nicht an den Borders liegen könnte, habe ich mir nochmal den PixelOffsetMode angeschaut. Ansonsten hätte ich den wahrscheinlich länger wieder ignoriert. Daher bedanke ich mich für die schnelle Antwort!

    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.

    Sekki schrieb:

    VB.NET-Quellcode

    1. Class FlatTextBox : Inherits Control
    Warum leitest Du die von Control und nicht von TextBox ab?
    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!