单位缇还是像素区别不大。
缇与像素的换成,使用 Screen.TwipsPerPixelX
和 Screen.TwipsPerPixelY 属性得到这个比例关系
以前写的一个过程,在指定区域内,按左右上下居中显示的方式显示字符串,该过程适用于 在图像框上显示内容,也适用于在打印机上打印内容
因为是自己用的代码,所以注释量偏少
程序代码:
Private Sub viewtext(cs As String, obj As Object, lefts As Long, tops As Long)
'每一个参数格式:X1,Y1,X2,Y2,显示内容,[字体[,字号]]
'字体为可选,字号也为可选,如果需要指定字号,就必须指定字体
On Error Resume Next
Dim fj() As String
Dim vx As Long, vy As Long
Dim Fx As Long, Fy As Long
Dim hx As Long, hy As Long
Dim m As String, n As String
Dim i As Long, j As Long, k As Long
Dim o As Long
Dim H() As String
fj = Split(cs, ",") '分解传进来的参数
If UBound(fj) > 4 Then '有字体设置
If Len(fj(5)) > 0 Then '字体名不为空
obj.FontName = fj(5)
End If
Else
obj.FontName = "宋体" '默认为宋体
End If
If UBound(fj) > 5 Then '有字号设置
If Val(fj(6)) > 2 Then '字号最小不得小于2
obj.FontSize = fj(6)
End If
Else
obj.FontSize = 字体大小
End If
Fy = obj.TextHeight(fj(4)) '字体高
Fx = obj.TextWidth(fj(4)) '字体宽
hx = Val(fj(2)) - Val(fj(0)) '有效宽
hy = Val(fj(3)) - Val(fj(1)) '有效高
If Fx > hx Or InStr(1, fj(4), "\") > 0 Then '如果需要换行或人工指定的多多行
If InStr(1, fj(4), "\") > 0 Then '如果人工指定的多多行
H = Split(fj(4), "\") '直接分解为每一行
k = UBound(H) '取行数
Else
k = Fx / hx '计算需要分成多少行
ReDim H(k)
i = 0
j = 1
o = 1
Do
H(i) = Mid(fj(4), j, o) '一个字符一个字符的试下去
If obj.TextWidth(H(i)) > hx - 100 Then '试到撑满格子为止
j = j + o '本行结束,保存各变量
o = 1
i = i + 1
Else
o = o + 1 '本行未结束,长度加一,继续试下去
End If
Loop While j + o < Len(fj(4)) + 2 '<原来就 要加1,因为循环前是o+1,所以这里要再加1
End If
For i = 0 To k '处理每一行
Fx = obj.TextWidth(H(i)) '字体宽
vx = lefts + Val(fj(0)) + (hx - Fx) / 2
vy = tops + Val(fj(1)) + (hy - Fy * (k + 1 + (k) * 0.2)) / 2 + Fy * (i) * 1.2 '行距为1.2,总高度为 行数*1+(行数-1)*0.2
obj.CurrentX = vx
obj.CurrentY = vy
obj.Print H(i)
Next i
Else '没有多行,直接计算坐标显示
vx = lefts + Val(fj(0)) + (hx - Fx) / 2
vy = tops + Val(fj(1)) + (hy - Fy) / 2
obj.CurrentX = vx
obj.CurrentY = vy
obj.Print fj(4)
End If
End Sub