В примере кода в этой статье можно добиться эффекта вертикального центрирования текстового поля VB TextBox. Обратите внимание: настройка многострочного атрибута в коде формы Form_Load() должна быть истинной, то есть Text1.MultiLine = True. Этот атрибут доступен только для чтения. Измените его во время разработки. по последующим кодам Не хочу. Щит можно изменить самостоятельно, просто вызовите эту функцию.
Конкретные коды функций следующие:
'============================================== = ============================'| Имя модуля| TextBoxMiddle'| Текстовое поле отображается в центре '==== ========================================== ===== ==========================Option ExplicitPrivate Type RECT Left As Long Top Как долго Справа Как долго Снизу Как LongEnd TypePrivate Объявить функцию SendMessage Lib "user32" Псевдоним "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) Как LongPrivate Объявить функцию SetWindowText Lib "user32" " Псевдоним "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As LongPrivate Объявить функцию CallWindowProc Lib "user32" Псевдоним "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPrivate Объявить функцию GetWindowLong Lib "user32" Псевдоним «GetWindowLongA» (ByVal hwnd As Long, ByVal nIndex As Long) As LongPrivate Объявить функцию SetWindowLong Lib "user32" Псевдоним "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPrivate Const EM_GETRECT = &HB2Private Const EM_SETRECTNP = &HB4Private Const GWL_WNDPROC = (-4) Частная константа WM_CHAR = &H102Private Const WM_PASTE As Long = &H302Private prevWndProc As LongPublic ClipText As StringPublic Sub DisableAbility(TargetTextBox As TextBox) prevWndProc = GetWindowLong(TargetTextBox.hwnd, GWL_WNDPROC) SetWindowLong TargetTextBox.hwnd, GWL_WNDPROC, AddressOf WndProcEnd SubPrivate 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 Если wParam <> 13 Тогда WndProc = CallWindowProc(prevWndProc , hwnd, Msg, wParam, lParam) Случай WM_PASTE ClipText = Clipboard.GetText Temp = Заменить(ClipText, Chr(10), "") Temp = Заменить(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 SelectEnd FunctionSub VerMiddleText(mForm As form, mText As TextBox) Если mText.MultiLine = False, то выйти из Sub Dim rc As RECT, tmpTop As Long, tmpBot As Длинный SendMessage mText.hwnd, EM_GETRECT, 0, rc С mForm.Font .Name = mText.Font.Name .Size = mText.Font.Size .Bold = mText.Font.Bold End С 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 mTextEnd Суб'//////////////////////////////////////////////// /// ///////'Ниже приведена форма Код'//////////////////////////////////////////////// /// ///////Частный Sub Form_Load() '================Внимание! ! ! ================= 'Многострочный атрибут должен иметь значение true, а Text1.MultiLine = True 'Этот атрибут доступен только для чтения, измените его во время разработки' Блокировка кода. Если вы не хотите его блокировать, вы можете изменить его самостоятельно'============================= ============= == 'Просто вызовите эту функцию VerMiddleText Me, Text1 Caption = Len(Text1)End Sub