在textbox里放按钮并控制输入字符不能覆盖住按钮(包括设计阶段)

本文介绍了一个自定义的TextBox控件,它包含一个内置的Button,并且在设计时和运行时能确保输入的文字不会覆盖按钮。控件通过重写WndProc方法来拦截键盘事件,当输入字符可能覆盖按钮时,会阻止进一步的输入。同时,Text属性设置时也会进行检查,若超出了允许显示的范围,则抛出异常。

Imports System.Text

Public Class mytextbox

    Inherits System.Windows.Forms.TextBox

Dim WithEvents btn As Button

Dim WithEvents btn As Button

    Public Sub New()

        MyBase.New()

 '该调用是 Windows 窗体设计器所必需的。

 '该调用是 Windows 窗体设计器所必需的。

        InitializeComponent()

  ' InitializeComponent() 调用之后添加任何初始化

  ' InitializeComponent() 调用之后添加任何初始化

        btn = New Button()

        btn.Size = New Size(23, 23)

        Me.Controls.Add(btn)

        btn.Dock = DockStyle.Right

        btn.BackColor = SystemColors.Control

        Me.Text = ""

    End Sub

 Public Event myclick(ByVal sender As Object, ByVal e As EventArgs)

 Public Event myclick(ByVal sender As Object, ByVal e As EventArgs)

    Private Sub btn_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn.Click

        RaiseEvent myclick(Me, e)

    End Sub

 Private Sub btn_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn.MouseEnter

 Private Sub btn_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn.MouseEnter

        Cursor = Cursors.Default

    End Sub

 Private Sub btn_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn.MouseLeave

 Private Sub btn_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn.MouseLeave

        Cursor = Cursors.IBeam

    End Sub

 Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

 Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

        Dim KeyAsc As Integer = m.WParam.ToInt32

        Select Case m.Msg

            Case &H102

                If checklength() Then

                    If KeyAsc <> 8 Then

                        Return

                    End If

                Else

                    Me.MaxLength = 0

                End If

            Case &H302

                If checklength() Then

                    Return

                End If

        End Select

        MyBase.WndProc(m)

    End Sub

    '检查函数

    Private Function checklength(Optional ByVal str As String = "") As Boolean

        If str = "" Then

            Dim leng As Integer = CInt(Me.CreateGraphics.MeasureString(Me.Text, Me.Font).Width)

            Dim m As Integer = Me.Width

            Dim p As Integer = btn.Width

            If leng >= m - p - 5 Then

                Return True

            End If

        Else

            Dim leng As Integer = CInt(Me.CreateGraphics.MeasureString(str, Me.Font).Width)

            Dim m As Integer = Me.Width

            Dim p As Integer = btn.Width

            If leng + 1 >= m - p Then

                Return True

            End If

        End If

        Return False

    End Function

    '修改text属性时检查

    Public Overrides Property Text() As String

        Get

            Return MyBase.Text

        End Get

        Set(ByVal Value As String)

            If checklength(Value) Then

                Throw New Exception("超出可以显示的范围!")

            End If

            MyBase.Text = Value

        End Set

    End Property

 End Class

 End Class

 ‘///////////////////////////////              闵峰

 ‘///////////////////////////////              闵峰

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值