VBA裡的尺寸單位很多,如Twip,Point,Pixel,Inch,Character,Millimeter, Centimeter等。而不同的地方使用的單位有時不一樣,例如Excel和Word裡的長寬單位多用Point,Access裡多用Twip,而 API裡用的尺寸單位多為Pixel,這樣單位轉換時會覺得有點混亂。這主要介紹用得比較多的Twip,Point和Pixel之間的轉換方法。
VBA裡的尺寸單位很多,如Twip,Point,Pixel,Inch,Character,Millimeter,Centimeter等。而不同的地方使用的單位有時不一樣,例如Excel和Word裡的長寬單位多用Point,Access裡多用Twip,而API裡用的尺寸單位多為 Pixel,這樣單位轉換時會覺得有點混亂。這主要介紹用得比較多的Twip,Point和Pixel之間的轉換方法。
Twip/Point是一個與屏幕無關的測量單位,這樣在打印時不要考慮屏幕分辨率的問題。Pixel則是同像素有關的測量單位。屏幕上顯示最小的一個點就是一個像素。
Twip,Point和Inch轉換公式如下:
Twip=1/20*Point=1/1440*Inch
Point=20*Twip=1/72*Inch
而Twip/Point同Pixel之間則要依據設備環境參數做轉換,下面是一些轉換的函數。
Private Const HORZRES = 8
Private Const VERTRES = 10
Private Const LOGPIXELSX = 88
Private Const LOGPIXELSY = 90
Private Const TWIPSPERINCH = 1440
Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function GetDeviceCaps Lib "gdi32" (ByVal hDC As Long, _
ByVal nIndex As Long) As Long
Public Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, _
ByVal hDC As Long) As Long
Function getDPI(bX As Boolean) As Integer '獲取屏幕分辨率
Dim hDC As Long, RetVal As Long
hDC = GetDC(0)
If bX = True Then
getDPI = GetDeviceCaps(hDC, LOGPIXELSX)
Else
getDPI = GetDeviceCaps(hDC, LOGPIXELSY)
End If
RetVal = ReleaseDC(0, hDC)
End Function
Function Pixel2TwipX(x As Long) As Long '水平方向Pixel轉Twip
Pixel2TwipX = (x / getDPI(True)) * TWIPSPERINCH
End Function
Function Pixel2TwipY(x As Long) As Long '垂直方向Pixel轉Twip
Pixel2TwipY = (x / getDPI(False)) * TWIPSPERINCH
End Function
Function Pixel2PointX(x As Long) As Long '水平方向Pixel轉Point
Pixel2PointX = Pixel2TwipX(x) / 20
End Function
Function Pixel2PointY(x As Long) As Long '垂直方向Pixel轉Point
Pixel2PointY = Pixel2TwipY(x) / 20
End Function
Function Twip2PixelX(x As Long) As Long '水平方向Twip轉Pixel
Twip2PixelX = x / TWIPSPERINCH * getDPI(True)
End Function
Function Twip2PixelY(x As Long) As Long '垂直方向Twip轉Pixel
Twip2PixelY = x / TWIPSPERINCH * getDPI(False)
End Function
Function Point2PixelX(x As Long) As Long '水平方向Point轉Pixel
Point2PixelX = Twip2PixelX(x * 20)
End Function
Function Point2PixelY(x As Long) As Long '垂直方向Point轉Pixel
Point2PixelY = Twip2PixelY(x * 20)
End Function
Function getScreenX() As Long '獲取屏幕寬
Dim hDC As Long, RetVal As Long
hDC = GetDC(0)
getScreenX = GetDeviceCaps(hDC, HORZRES)
RetVal = ReleaseDC(0, hDC)
End Function
Function getScreenY() As Long '獲取屏幕高
Dim hDC As Long, RetVal As Long
hDC = GetDC(0)
getScreenY = GetDeviceCaps(hDC, VERTRES)
RetVal = ReleaseDC(0, hDC)
End Function