本文實(shí)例代碼可以實(shí)現(xiàn)讓VB的TextBox文本框垂直居中顯示效果。此處需要注意:Form_Load()窗體代碼中的多行屬性設(shè)置必須為真,即Text1.MultiLine = True,該屬性為只讀屬性,請(qǐng)?jiān)谠O(shè)計(jì)時(shí)修改,換行會(huì)被之后的代碼屏蔽,不想屏蔽可自行修改,調(diào)用此函數(shù)就好了。
具體的功能代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
'================================================================================ '| 模 塊 名 | TextBoxMiddle '| 說(shuō) 明 | 文本框居中顯示 '================================================================================= Option Explicit Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Private Declare Function SendMessage Lib "user32 " Alias "SendMessageA" ( ByVal hwnd As Long , ByVal wMsg As Long , ByVal wParam As Long , lParam As Any) As Long Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" ( ByVal hwnd As Long , ByVal lpString As String ) As Long Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" ( ByVal lpPrevWndFunc As Long , ByVal hwnd As Long , ByVal Msg As Long , ByVal wParam As Long , ByVal lParam As Long ) As Long Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" ( ByVal hwnd As Long , ByVal nIndex As Long ) As Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" ( ByVal hwnd As Long , ByVal nIndex As Long , ByVal dwNewLong As Long ) As Long Private Const EM_GETRECT = &HB2 Private Const EM_SETRECTNP = &HB4 Private Const GWL_WNDPROC = (-4) Private Const WM_CHAR = &H102 Private Const WM_PASTE As Long = &H302 Private prevWndProc As Long Public ClipText As String Public Sub DisableAbility(TargetTextBox As TextBox) prevWndProc = GetWindowLong(TargetTextBox.hwnd, GWL_WNDPROC) SetWindowLong TargetTextBox.hwnd, GWL_WNDPROC, AddressOf WndProc End Sub Private Function WndProc( ByVal hwnd As Long , ByVal Msg As Long , ByVal wParam As Long , ByVal lParam As Long ) As Long Dim Temp As String Select Case Msg Case WM_CHAR If wParam <> 13 Then WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam) Case WM_PASTE ClipText = Clipboard.GetText Temp = Replace(ClipText, Chr(10), "" ) Temp = Replace(Temp, Chr(13), "" ) Clipboard.Clear Clipboard.SetText Temp WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam) Clipboard.Clear Clipboard.SetText ClipText Case Else WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam) End Select End Function Sub VerMiddleText(mForm As form, mText As TextBox) If mText.MultiLine = False Then Exit Sub Dim rc As RECT, tmpTop As Long , tmpBot As Long SendMessage mText.hwnd, EM_GETRECT, 0, rc With mForm.Font .Name = mText.Font.Name .Size = mText.Font.Size .Bold = mText.Font.Bold End With tmpTop = ((rc.Bottom - rc.Top) - _ (mText.Parent.TextHeight( "H " ) \ Screen.TwipsPerPixelY)) \ 2 + 2 tmpBot = ((rc.Bottom - rc.Top) + _ (mText.Parent.TextHeight( "H " ) \ Screen.TwipsPerPixelY)) \ 2 + 2 rc.Top = tmpTop rc.Bottom = tmpBot mText.Alignment = vbCenter SendMessage mText.hwnd, EM_SETRECTNP, 0&, rc mText.Refresh DisableAbility mText End Sub '/////////////////////////////////////////////////////// '以下為窗體代碼 '/////////////////////////////////////////////////////// Private Sub Form_Load() '================注意!!!================= '多行屬性必須為真,暨Text1.MultiLine = True '該屬性為只讀屬性,請(qǐng)?jiān)谠O(shè)計(jì)時(shí)修改 '換行會(huì)被之后的代碼屏蔽,不想屏蔽可自行修改 '=========================================== '調(diào)用此函數(shù)就好了 VerMiddleText Me , Text1 Caption = Len(Text1) End Sub |