Visual Studio自定义边框TextBox添加到工具箱后不显示彩色边框求助
问题修复说明
以下是代码存在的核心问题及修复方案:
存在的问题
- 原生TextBox默认关闭了用户绘制触发逻辑,你写的
Paint事件默认不会执行 - 绘制边框时使用的矩形坐标错误:
Location是控件相对于父窗体的坐标,而Paint事件的绘图坐标系原点在控件自身左上角,直接用这个坐标会把边框画到控件可视区域外 - 自定义属性修改后没有主动触发重绘,运行时修改属性不会同步更新界面
- 自定义的
BorderStyle属性和TextBox原生属性同名,容易产生调用冲突
修复后的完整代码
Imports System.Windows.Forms Imports System.Drawing Public Class CustomTextBox Inherits System.Windows.Forms.TextBox Public Enum BorderSideOptions Left Right Top Bottom All End Enum Dim BrdrColor As Color = Color.Blue Dim BrdrSize As Single = 1 Dim BrdrStyle As ButtonBorderStyle = ButtonBorderStyle.Solid Dim BorderSide As BorderSideOptions = BorderSideOptions.All Public Sub New() ' 开启用户绘制权限,触发Paint事件 SetStyle(ControlStyles.UserPaint Or ControlStyles.AllPaintingInWmPaint Or ControlStyles.OptimizedDoubleBuffer, True) Me.Width = 120 Me.Height = 20 Me.BackColor = Color.White Me.ForeColor = Color.Black ' 关闭原生默认边框,避免和自定义边框重叠 MyBase.BorderStyle = BorderStyle.None End Sub Property BorderSides As BorderSideOptions Get Return BorderSide End Get Set(value As BorderSideOptions) BorderSide = value ' 修改属性后触发重绘 Me.Invalidate() End Set End Property Property BorderColor() As Color Get Return BrdrColor End Get Set(value As Color) BrdrColor = value Me.Invalidate() End Set End Property Property BorderSize() As Single Get Return BrdrSize End Get Set(value As Single) BrdrSize = value Me.Invalidate() End Set End Property ' 重命名避免和原生BorderStyle属性冲突 Property CustomBorderStyle() As ButtonBorderStyle Get Return BrdrStyle End Get Set(value As ButtonBorderStyle) BrdrStyle = value Me.Invalidate() End Set End Property Private Sub CustomTextBox_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint ' 直接使用控件自身的客户端区域作为绘制范围 Dim txtRect As Rectangle = Me.ClientRectangle Dim B As Color = Color.Black Select Case BorderSides Case BorderSideOptions.All ControlPaint.DrawBorder(e.Graphics, txtRect, BrdrColor, BrdrSize, BrdrStyle, BrdrColor, BrdrSize, BrdrStyle, BrdrColor, BrdrSize, BrdrStyle, BrdrColor, BrdrSize, BrdrStyle) Case BorderSideOptions.Bottom ControlPaint.DrawBorder(e.Graphics, txtRect, B, 0, ButtonBorderStyle.None, B, 0, ButtonBorderStyle.None, B, 0, ButtonBorderStyle.None, BrdrColor, BrdrSize, BrdrStyle) Case BorderSideOptions.Left ControlPaint.DrawBorder(e.Graphics, txtRect, BrdrColor, BrdrSize, BrdrStyle, B, 0, ButtonBorderStyle.None, B, 0, ButtonBorderStyle.None, B, 0, ButtonBorderStyle.None) Case BorderSideOptions.Right ControlPaint.DrawBorder(e.Graphics, txtRect, B, 0, ButtonBorderStyle.None, B, 0, ButtonBorderStyle.None, BrdrColor, BrdrSize, BrdrStyle, B, 0, ButtonBorderStyle.None) Case BorderSideOptions.Top ControlPaint.DrawBorder(e.Graphics, txtRect, B, 0, ButtonBorderStyle.None, BrdrColor, BrdrSize, BrdrStyle, B, 0, ButtonBorderStyle.None, B, 0, ButtonBorderStyle.None) End Select End Sub End Class
测试注意事项
修复后重新编译控件项目,再重新把控件拖到窗体上测试即可,在属性窗口修改BorderColor、BorderSize等属性可以实时看到效果。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

