记住,设置 Text1 的 Multiline = TrueDim aa As String, i As Integer, jj As Integer, maxline As Integer, LineCnt As Long 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 Const EM_GETLINECOUNT = &HBAPrivate Sub Form_Load() '窗体与Command1居中 Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2 Command1.Move (Me.Width - Command1.Width) \ 2, Text1.Height + Text1.Top + 200 Command1.Caption = "居中显示" 'Text1.Alignment = 2 'TextBox 水平居中显示 'aa = "Attn:楼主" 'aa = aa & Chr(13) & Chr(10) 'aa = aa & "呵呵你的问题都好奇怪,但也让我学了不少!" 'aa = aa & Chr(13) & Chr(10) 'aa = aa & "我也想不出其它的好方法" 'aa = aa & Chr(13) & Chr(10) aa = aa & "你认为这样行吗?" Text1.Text = aa End SubPrivate Sub Command1_Click() LineCnt = TextBoxLineCnt(Text1) '每增加一行加上180,当然是以默认的字体大小而言 maxline = Text1.Height \ 180 '计算textbox能装下几行 jj = (maxline - LineCnt) \ 2 '垂直居中,(textbox总行数-Text1的总行数)整除2 For i = 1 To jj '装上几行空白 Text1.Text = Chr(13) & Chr(10) & Text1.Text Next i MsgBox "总共有" & CStr(LineCnt) & "行文字,看看垂直居中了吗?" End SubPublic Function TextBoxLineCnt(ctl As TextBox) As Long '计算总行数的函数 TextBoxLineCnt = SendMessage(ctl.hwnd, EM_GETLINECOUNT, 0, 0) End Function
方法很多,API:同样,记住,设置 Text1 的 Multiline = True 模块中: Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPublic Const EM_SETRECTNP = &HB4 Public Const EM_GETLINECOUNT = &HBA Public Const ES_CENTER = &H1&Public Type RECT Left As Long Top As Long Right As Long Bottom As Long End TypePublic Sub VerMiddleText(mText As TextBox)If mText.MultiLine = False Then Exit Sub Dim rc As RECT, tmpTop As Long, tmpBot As Long, L As Long, FontHeight As Long, H As Long, W As LongL = SendMessage(mText.hwnd, EM_GETLINECOUNT, 0&, rc) FontHeight = Form1.ScaleY(mText.FontSize / 72, 5, 3) H = Form1.ScaleY(mText.Height, 1, 3) W = Form1.ScaleY(mText.Width, 1, 3) tmpTop = (H - L * FontHeight) / 2 - 3tmpBot = tmpTop + (L + 1) * FontHeight With rc .Top = tmpTop .Bottom = tmpBot .Left = 1 .Right = W - 3 End WithSendMessage mText.hwnd, EM_SETRECTNP, 0&, rc mText.RefreshEnd Sub窗体中: Private Sub Command1_Click() VerMiddleText Text1 End Sub(试试文本框一行半文本高度时,写一行文本,看它的垂直位置)。
自定义TextBox控件对齐方式为为垂直居中 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 Const EM_GETRECT = &HB2 Private Const EM_SETRECTNP = &HB4 Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End TypePrivate Function SetVCenterText(userdefineTextBox As TextBox) Dim rc As RECT Dim UserControlTop As Long Dim UserControlBottom As Long If userdefineTextBox.MultiLine = False Then Exit Function Call SendMessage(userdefineTextBox.hwnd, EM_GETRECT, 0, rc) UserControlTop = ((rc.Bottom - rc.Top) - (UserControl.Parent.TextHeight("H") \ Screen.TwipsPerPixelY)) \ 2 UserControlBottom = ((rc.Bottom - rc.Top) + (UserControl.Parent.TextHeight("H") \ Screen.TwipsPerPixelY)) \ 2 rc.Top = UserControlTop rc.Bottom = UserControlBottom userdefineTextBox.Alignment = vbCenter Call SendMessage(userdefineTextBox.hwnd, EM_SETRECTNP, 0&, rc) userdefineTextBox.Refresh End FunctionPrivate Sub UserControl_Resize() Text1.Top = 0 Text1.Left = 0 Text1.Height = UserControl.Height Text1.Width = UserControl.Width
事实上,我除了看明白你说的上下居中的意思外,对你的总的意思并不明白.
就怕像昨天这人的帖子一样,讨论到后来还是发现他的需求没完全定义好;)http://topic.csdn.net/u/20100221/01/b77c6acb-79ca-44c0-a16c-ed3ec1edab38.html
如何循环模拟用键盘输入List1列表中的内容
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
Const EM_GETLINECOUNT = &HBAPrivate Sub Form_Load()
'窗体与Command1居中
Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
Command1.Move (Me.Width - Command1.Width) \ 2, Text1.Height + Text1.Top + 200
Command1.Caption = "居中显示"
'Text1.Alignment = 2 'TextBox 水平居中显示
'aa = "Attn:楼主"
'aa = aa & Chr(13) & Chr(10)
'aa = aa & "呵呵你的问题都好奇怪,但也让我学了不少!"
'aa = aa & Chr(13) & Chr(10)
'aa = aa & "我也想不出其它的好方法"
'aa = aa & Chr(13) & Chr(10)
aa = aa & "你认为这样行吗?"
Text1.Text = aa
End SubPrivate Sub Command1_Click()
LineCnt = TextBoxLineCnt(Text1)
'每增加一行加上180,当然是以默认的字体大小而言
maxline = Text1.Height \ 180 '计算textbox能装下几行
jj = (maxline - LineCnt) \ 2 '垂直居中,(textbox总行数-Text1的总行数)整除2
For i = 1 To jj '装上几行空白
Text1.Text = Chr(13) & Chr(10) & Text1.Text
Next i
MsgBox "总共有" & CStr(LineCnt) & "行文字,看看垂直居中了吗?"
End SubPublic Function TextBoxLineCnt(ctl As TextBox) As Long '计算总行数的函数
TextBoxLineCnt = SendMessage(ctl.hwnd, EM_GETLINECOUNT, 0, 0)
End Function
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPublic Const EM_SETRECTNP = &HB4
Public Const EM_GETLINECOUNT = &HBA
Public Const ES_CENTER = &H1&Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End TypePublic Sub VerMiddleText(mText As TextBox)If mText.MultiLine = False Then Exit Sub
Dim rc As RECT, tmpTop As Long, tmpBot As Long, L As Long, FontHeight As Long, H As Long, W As LongL = SendMessage(mText.hwnd, EM_GETLINECOUNT, 0&, rc)
FontHeight = Form1.ScaleY(mText.FontSize / 72, 5, 3)
H = Form1.ScaleY(mText.Height, 1, 3)
W = Form1.ScaleY(mText.Width, 1, 3)
tmpTop = (H - L * FontHeight) / 2 - 3tmpBot = tmpTop + (L + 1) * FontHeight
With rc
.Top = tmpTop
.Bottom = tmpBot
.Left = 1
.Right = W - 3
End WithSendMessage mText.hwnd, EM_SETRECTNP, 0&, rc
mText.RefreshEnd Sub窗体中:
Private Sub Command1_Click()
VerMiddleText Text1
End Sub(试试文本框一行半文本高度时,写一行文本,看它的垂直位置)。
picturebox.CurrentX = 8
picturebox.CurrentY = 1
picturebox.print "文字";
http://www.cnblogs.com/lxcc/archive/2005/08/08/209938.html
自定义TextBox控件对齐方式为为垂直居中
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 Const EM_GETRECT = &HB2
Private Const EM_SETRECTNP = &HB4
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End TypePrivate Function SetVCenterText(userdefineTextBox As TextBox) Dim rc As RECT Dim UserControlTop As Long Dim UserControlBottom As Long If userdefineTextBox.MultiLine = False Then Exit Function Call SendMessage(userdefineTextBox.hwnd, EM_GETRECT, 0, rc) UserControlTop = ((rc.Bottom - rc.Top) - (UserControl.Parent.TextHeight("H") \ Screen.TwipsPerPixelY)) \ 2 UserControlBottom = ((rc.Bottom - rc.Top) + (UserControl.Parent.TextHeight("H") \ Screen.TwipsPerPixelY)) \ 2 rc.Top = UserControlTop rc.Bottom = UserControlBottom userdefineTextBox.Alignment = vbCenter Call SendMessage(userdefineTextBox.hwnd, EM_SETRECTNP, 0&, rc) userdefineTextBox.Refresh
End FunctionPrivate Sub UserControl_Resize()
Text1.Top = 0
Text1.Left = 0
Text1.Height = UserControl.Height
Text1.Width = UserControl.Width
SetVCenterText Text1
End Sub