Option Explicit Private Type POINTAPI X As Long Y As Long End Type Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Private Declare Function ExtTextOut Lib "gdi32" Alias "ExtTextOutA" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal wOptions As Long, ByVal lpRect As Any, ByVal lpString As String, ByVal nCount As Long, lpDx As Long) As Long Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long Private Declare Function GetTextExtentPoint32 Lib "gdi32" Alias "GetTextExtentPoint32A" (ByVal hdc As Long, ByVal lpsz As String, ByVal cbString As Long, lpSize As POINTAPI) As Long Private Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As LongPrivate Sub Form_Load() Me.Font = "宋体" Text1.Font = "宋体"
Me.FontSize = 12 Text1.FontSize = 12
Text1.Text = ""
End SubPrivate Sub Text1_Change() Dim l As Long Dim w As Long Dim textsize As POINTAPI l = LenB(StrConv(Text1.Text, vbFromUnicode)) w = GetTextExtentPoint32(Me.hdc, Text1.Text, l, textsize) If l * textsize.X > Text1.Width Then Text1.Text = Mid(Text1.Text, 1, Len(Text1.Text) - 1) Text1.SelStart = Len(Text1.Text) End If End Sub
ret = SendMessage(txtTotal.hWnd, EM_GETSEL, 0, 0) intStart = ret And 65535 intEnd = (ret And &HFFFF0000) / (2 ^ 16) ret = SendMessage(txtTotal.hWnd, EM_POSFROMCHAR, intStart, 0) intStartX = ret And 65535 ret = SendMessage(txtTotal.hWnd, EM_POSFROMCHAR, intEnd + 1, 0) intEndX = ret And 65535 length = intEndX - intStartX End Sub 这段代码可以得到实际宽度,但是放到Keypress事件中就不行了, txtTotal.SelStart = 0 txtTotal.SelLength = Len(txtTotal.Text),因为这两句导致只能输入一个字符
protected override void WndProc(ref System.Windows.Forms.Message m) {} 中間用正則表達式判斷
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function ExtTextOut Lib "gdi32" Alias "ExtTextOutA" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal wOptions As Long, ByVal lpRect As Any, ByVal lpString As String, ByVal nCount As Long, lpDx As Long) As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Private Declare Function GetTextExtentPoint32 Lib "gdi32" Alias "GetTextExtentPoint32A" (ByVal hdc As Long, ByVal lpsz As String, ByVal cbString As Long, lpSize As POINTAPI) As Long
Private Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As LongPrivate Sub Form_Load()
Me.Font = "宋体"
Text1.Font = "宋体"
Me.FontSize = 12
Text1.FontSize = 12
Text1.Text = ""
End SubPrivate Sub Text1_Change()
Dim l As Long
Dim w As Long
Dim textsize As POINTAPI
l = LenB(StrConv(Text1.Text, vbFromUnicode))
w = GetTextExtentPoint32(Me.hdc, Text1.Text, l, textsize)
If l * textsize.X > Text1.Width Then
Text1.Text = Mid(Text1.Text, 1, Len(Text1.Text) - 1)
Text1.SelStart = Len(Text1.Text)
End If
End Sub
Dim ret As Long
Dim intStart As Integer, intEnd As Integer, intStartX As Integer, intEndX As Integer
txtTotal.SelStart = 0
txtTotal.SelLength = Len(txtTotal.Text)
ret = SendMessage(txtTotal.hWnd, EM_GETSEL, 0, 0)
intStart = ret And 65535
intEnd = (ret And &HFFFF0000) / (2 ^ 16)
ret = SendMessage(txtTotal.hWnd, EM_POSFROMCHAR, intStart, 0)
intStartX = ret And 65535
ret = SendMessage(txtTotal.hWnd, EM_POSFROMCHAR, intEnd + 1, 0)
intEndX = ret And 65535
length = intEndX - intStartX
End Sub
这段代码可以得到实际宽度,但是放到Keypress事件中就不行了,
txtTotal.SelStart = 0
txtTotal.SelLength = Len(txtTotal.Text),因为这两句导致只能输入一个字符
{}
中間用正則表達式判斷