Public Sub mPrintStr(Optional mStringVal As String = "", _
Optional mFontName As String = "宋体", Optional mFontSize As Single = 10, Optional mX1 As Single = 0, _
Optional mY1 As Single = 0, Optional mX2 As Single = 0, Optional mY2 As Single = 0, Optional mAlign_V As Integer = 0, _
Optional mAlign_H As Integer = 0, Optional mWSpace As Single = 0, Optional mLSpace As Single = 0)
'字符串 mStringVal 中字符的预号
Dim I As Long
'字符串 mStringVal 中当前指定的字符(第i个)
Dim mS As String
'宽度和高度合计
Dim mWTotal As Single, mHTotal As Single
'一行中最高的字符的高度
Dim mMaxH As Single
'第一行中最高的字符的高度
Dim mMaxHFL As Single
'最后一行的行编号
Dim mLastLineNum As Long
'最后一行的字符宽度合计
Dim mLastLineWidth As Single
'当前行第一个字符打印位置
Dim mX As Single, mY As Single
'当前打印行的编号
Dim mLine As Long
If mStringVal = "" Then Exit Sub
' mX1 = 0 Or _
' mY1 = 0 Or _
' mX2 = 0 Or _
' mY2 = 0 Then Exit Sub
' '如果有指定的控件,则要先从设定表中读入相关的参数(字体、位置...)
' '其实这一部分留给调用程序较好
' If mControlID > 0 Then
'
' End If
mMaxH = 0
mWTotal = 0
'至少打印一行???
mLastLineNum = 1
With Printer
'定义计算单位为 mm
' .ScaleMode = vbMillimeters
.ScaleMode = vbTwips
.FontName = mFontName
.FontSize = mFontSize
For I = 1 To Len(mStringVal)
'取出一个字符
mS = Mid(mStringVal, I, 1)
'若当前行还可以容下当前指定的字符,继续在当前行打印
If mWTotal <= mX2 - mX1 - .TextWidth(mS) + mWSpace Then
'取当前行最高的字符的高度值(如果当前字符高度>之前最高字符,则取当前字符作为
'本行最高字符,否则,保持原最高字符(已考虑行高调整值)
mMaxH = IIf(.TextHeight(mS) + mLSpace > mMaxH, .TextHeight(mS) + mLSpace, mMaxH)
End If
'必须换至下一行
If mWTotal > mX2 - mX1 - .TextWidth(mS) + mWSpace Then
'行高累加
mHTotal = mHTotal + mMaxH
'最后一行的编号
mLastLineNum = mLastLineNum + 1
'换到下一行
mMaxH = .TextHeight(mS) + mLSpace
mWTotal = 0
End If
'记下第一行的高度
If mLastLineNum = 1 Then
mMaxHFL = mMaxH
End If
'宽度累加
mWTotal = mWTotal + .TextWidth(mS) + mWSpace
Next I
'若字符总高度小于给定的打印高度
If mHTotal < mY2 - mY1 Then
Select Case mAlign_H
'要求垂直方向顶端对齐的
Case 0
mY = mY1
'要求垂直方向对中的
Case 1
mY = mY1 + (mY2 - mY1 - mHTotal) / 2
'要求垂直方向底端对齐的
Case 2
mY = mY2 - mHTotal
End Select
Else
mY = mY1
End If
'若是最后一行,且水平方向要求对中的-------(更完善的方案用数组记下各行的宽度,每行都设置?)
If mLine = mLastLineNum Then
Select Case mAlign_V
'要求水平方向左对齐的
Case 0
mX = mX1
'要求水平方向对中的
Case 1
mX = mX1 + (mX2 - mX1 - mLastLineWidth) / 2
'要求水平方向右对齐的
Case 2
mX = mX2 - mLastLineWidth
End Select
Else
mX = mX1
End If
mS = ""
mMaxH = 0
mWTotal = 0
mHTotal = 0
For I = 1 To Len(mStringVal)
'取出一个字符
mS = Mid(mStringVal, I, 1)
'若是最后一行,且水平方向要求对中的
If mLine = mLastLineNum Then
Select Case mAlign_V
'要求水平方向左对齐的
Case 0
mX = mX1
'要求水平方向对中的
Case 1
mX = mX1 + (mX2 - mX1 - mLastLineWidth) / 2
'要求水平方向右对齐的
Case 2
mX = mX2 - mLastLineWidth
End Select
Else
mX = mX1
End If