この記事のサンプル コードでは、VB TextBox テキスト ボックスを垂直方向に中央揃えにする効果を実現できます。ここで注意してください: Form_Load() フォーム コードの複数行属性の設定は true、つまり Text1.MultiLine = True である必要があります。この属性は設計時に変更してください。シールドは自分で変更できます。この関数を呼び出すだけです。
具体的な機能コードは以下のとおりです。
'================================================ = ============================='| TextBoxMiddle 説明| '==== ============================================ ===== ===========================オプション ExplicitPrivate 型 RECT Left As Long Top As Long Right As Long Bottom As LongEnd TypePrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long、ByVal wMsg As Long、ByVal wParam As Long、lParam As Any) As LongPrivate Declare Function SetWindowText Lib "user32 " エイリアス "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As LongPrivate 宣言関数 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 LongPrivate 宣言関数 GetWindowLong Lib "user32" Alias "GetWindowLongA " (ByVal hwnd As Long、ByVal nIndex As) Long) As LongPrivate 宣言関数 SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long、ByVal nIndex As Long、ByVal dwNewLong As Long) As LongPrivate Const EM_GETRECT = &HB2Private Const EM_SETRECNP = &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, WndProcEnd のアドレス SubPrivate 関数 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) の場合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 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 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_SETRECNP、0&、 rc mText.Refresh DisableAbility mTextEndサブ「/////////////////////////////////////////////// /// ///////'以下はフォームですコード'//////////////////////////////////////////////// /// ///////プライベートSub Form_Load() '================注意! ! ! ================= '複数行属性は true である必要があり、Text1.MultiLine = True 'この属性は読み取り専用属性です。設計時に変更してください。'コード ブロッキング。ブロックしたくない場合は、自分で変更できます。'=============================== ============= == 'この関数を呼び出すだけです VerMiddleText Me, Text1 Caption = Len(Text1)End Sub