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
‘/////////////////////////////// 闵峰
‘/////////////////////////////// 闵峰

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

被折叠的 条评论
为什么被折叠?



