You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:48:03