在一次做圖片打印的時候,對位置的調整老是不得法,后來通過CBM666老師的幫助才解決問題,分享以下他給的幫助。

'PaintPicture pic, destX, destY, destWidth, destHeight, scrX, scrY, scrWidth, scrHeight
'其中Pic:為圖片對象, 如圖形框Picture等;
'destX,destY:目標圖像位置;
'destWidth,destHeight:目標圖像尺寸;
'scrX,scrY:原圖像的裁剪坐標;
'scrWidth,scrHeight:原圖像的裁剪尺寸;
Printer.PaintPicture picA.Picture, 200, 200, picA.Width / 2, picA.Height / 2
Printer.EndDoc
'VB 打印圖片
Private Sub Command1_Click()
On Error GoTo Err1
If Picture1.Picture <> LoadPicture("") Then
Printer.PaintPicture Picture1.Picture, 200, Picture1.Top + 1000 '打印圖片
Else
MsgBox "沒有可打印的圖片", 16, "提示"
End If
Printer.EndDoc '打印結束
Exit Sub
Err1:
MsgBox Err.Description, 16, "提示" '錯誤處理
End Sub
【屬性匹配與窗體縮放】
因為控制打印機實際繪圖區域大小的屬性Height和Width,由目前正在使用的紙張決定,而且可打印的區域與紙張邊緣有一定距離。因而為了獲得正確的打印輸出結果,不能簡單地將Printer對象直接傳遞給繪圖例行程序,還必須要解決打印機的縮放屬性與顯示窗體屬性相匹配的問題。即:保證使窗體中的打印內容以正確的大小顯示,並居於可打印區域的中間。實際上實現的是打印機的坐標體系向屏幕坐標體系的轉換。具體過程是:使用打印機的ScaleX和ScaleY方法,獲取以twip為單位的打印機尺寸,再利用窗體的ScaleX和ScaleY方法將這些尺寸轉換為窗體中的坐標系統,從而實現以窗體的坐標系統提供打印機可打印區域大小的目的。然后,用這些尺寸作為打印機中新的ScaleWidth和ScaleHeight,即可實現屬性匹配。
但是,我們在打印時,經常會遇到這樣的場合——在不改變窗體形狀的情況下,需要擴大或縮小窗體的大小。要完成這樣的工作,不僅需要完成屬性匹配,還要確定對象被縮放的系數。程序如下:
Private Sub SetPrinterScale(obj As Object)
Dim pwid As Single, phgt As Single, xmid As Single, ymid As Single
Dim owid As Single, ohgt As Single
owid = obj.ScaleX(obj.ScaleWidth, obj.ScaleMode, vbTwips)
ohgt = obj.ScaleY(obj.ScaleHeight, obj.ScaleMode, vbTwips)
'獲取窗體以Twips表示的尺寸
pwid = Printer.ScaleX(Printer.ScaleWidth, Printer.ScaleMode, vbTwips)
phgt = Printer.ScaleY(Printer.ScaleHeight, Printer.ScaleMode, vbTwips)
'獲取打印機以Twips表示的尺寸
If (ohgt / owid > phgt / pwid) Then
s = phgt / ohgt
Else
s = pwid / owid
End If ‘'計算縮放因子
pwid = obj.ScaleX(pwid, vbTwips, obj.ScaleMode) / s
phgt = obj.ScaleY(phgt, vbTwips, obj.ScaleMode) / s
'將打印機的尺寸轉換成obj的坐標系統 / 縮放因子
x_mid = obj.ScaleLeft + obj.ScaleWidth / 2
y_mid = obj.ScaleTop + obj.ScaleHeight / 2 '設置打印區域的中心點坐標
Printer.Scale (x_mid - pwid / 2, y_mid - phgt / 2)-(x_mid + pwid / 2, y_mid + phgt / 2)
'設置打印機中新的ScaleWidth和ScaleHeight
End Sub