Option Explicit
'该模块用于协调打印机 和打印预览控件
'使预览结果和打印结果一样
',从别处复制又修改过的,可能有错误
'
Private Type BITMAPINFOHEADER_TYPE
biSize As Long
biWidth As Long
biHeight As Long
biPlanes As Long
biBitCount As Long
biCompression As Long
biSizeImage As Long
biXPelsPerMeter As Long
biYPelsPerMeter As Long
biClrUsed As Long
biClrImportant As Long
bmiColors As String * 1024
End Type
Private Type BITMAPINFO_TYPE
BitmapInfoHeader As BITMAPINFOHEADER_TYPE
bmiColors As String * 1024
End Type
' Enter each of the following Declare statements as one, single line:
Private Declare Function GetDIBits Lib "gdi32" (ByVal hDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, ByVal lpBits As Long, BitmapInfo As BITMAPINFO_TYPE, ByVal wUsage As Long) As Long
Private Declare Function StretchDIBits Lib "gdi32" (ByVal hDC As Long, ByVal DestX As Long, ByVal DestY As Long, ByVal wDestWidth As Long, ByVal wDestHeight As Long, ByVal SrcX As Long, ByVal SrcY As Long, ByVal wSrcWidth As Long, ByVal wSrcHeight As Long, ByVal lpBits As Long, BitsInfo As BITMAPINFO_TYPE, ByVal wUsage As Long, ByVal dwRop As Long) As Long
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal lMem As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Const SRCCOPY = &HCC0020
Const BI_RGB = 0
Const DIB_RGB_COLORS = 0
Const GMEM_MOVEABLE = 2
'保持属性值的局部变量
Private mvarpaperSize As Long '纸张大小
Private m_PaperWidth As Single
Private m_PaperHeight As Single
Private mvarleftGap As Single '局部复制
Private mvarrightGap As Single '局部复制
Private mvartopGap As Single '局部复制
Private mvarbottomGap As Single '局部复制
Private mvarCurrentX As Single '局部复制
Private mvarCurrentY As Single '局部复制
Private mvarFontName As String '局部复制
Private mvarFontSize As String '局部复制
Dim ObjPrint As Object '用哪个控件来进行预览
Dim toview As Boolean '是否要进行预览
Dim Ratio As Single '预览时候的字体显示比例
Dim sm As Long '记录最初时的scaleMode
Dim LRGap As Single
Dim TBgap As Single
'保持属性值的局部变量
Private mvarOrientation As Long '局部复制
Public Function StartDoc(objToPrintOn As Variant, ByVal toViewObj As Boolean) As Boolean ', ByVal PaperWidth As Single, ByVal PaperHeight As Single)
Dim psm As Long
On Error GoTo errout
toview = toViewObj
If mvarpaperSize <> 0 And mvarpaperSize <> 256 Then
Printer.paperSize = mvarpaperSize
ElseIf mvarpaperSize = 256 Then
Printer.width = m_PaperWidth
Printer.height = m_PaperHeight
End If
If mvarOrientation = 1 Or mvarOrientation = 2 Then
Printer.Orientation = mvarOrientation
End If
sm = Printer.ScaleMode
Printer.ScaleMode = 7 '厘米
If toview = False Then
Printer.FontTransparent = True
Else
Set ObjPrint = objToPrintOn
ObjPrint.ScaleMode = 7
psm = ObjPrint.Parent.ScaleMode
ObjPrint.Parent.ScaleMode = 7
ObjPrint.height = (ObjPrint.ScaleWidth / Printer.ScaleWidth) * Printer.ScaleHeight
Ratio = ObjPrint.ScaleWidth / Printer.ScaleWidth
ObjPrint.Scale (0, 0)-(CSng(Printer.ScaleWidth), CSng(Printer.ScaleHeight))
ObjPrint.Parent.ScaleMode = psm
'
'
' Set ObjPrint.Font = Printer.Font
' ObjPrint.Font.Size = Printer.Font.Size * Ratio
ObjPrint.ForeColor = Printer.ForeColor
ObjPrint.FontTransparent = True
ObjPrint.Cls
End If
StartDoc = True
Exit Function
errout:
MsgBox "打印机错误", vbInformation
StartDoc = False
End Function
Public Sub EndDoc()
If toview = False Then
Printer.EndDoc
Printer.ScaleMode = sm
End If
End Sub
Public Sub PrintPicture(picSource As Object, ByVal pLeft As Single, ByVal pTop As Single, ByVal pWidth As Single, ByVal pHeight As Single)
'下面这一段为图形打印,有些变量还没搞清楚
Dim BitmapInfo As BITMAPINFO_TYPE
Dim DesthDC As Long
Dim hMem As Long
Dim lpBits As Long
Dim r As Long
' Precaution:
' If pLeft < LRGap Or pTop < TBgap Then Exit Sub
' If pWidth < 0 Or pHeight < 0 Then Exit Sub
' If pWidth + pLeft > PgWidth - LRGap Then Exit Sub
' If pHeight + pTop > PgHeight - TBgap Then Exit Sub
picSource.ScaleMode = 3 'Pixels
picSource.AutoRedraw = False
picSource.Visible = False
picSource.AutoSize = True
If toview = False Then
Printer.ScaleMode = 3 'Pixels
' Calculate size in pixels:
pLeft = ((pLeft - LRGap) * 1440) / Printer.TwipsPerPixelX
pTop = ((pTop - TBgap) * 1440) / Printer.TwipsPerPixelY
pWidth = (pWidth * 1440) / Printer.TwipsPerPixelX
pHeight = (pHeight * 1440) / Printer.TwipsPerPixelY
Printer.Print ""
DesthDC = Printer.hDC
Else
ObjPrint.Scale
ObjPrint.ScaleMode = 3 'Pixels
' Calculate size in pixels:
pLeft = ((pLeft * 1440) / Screen.TwipsPerPixelX) * Ratio
pTop = ((pTop * 1440) / Screen.TwipsPerPixelY) * Ratio
pWidth = ((pWidth * 1440) / Screen.TwipsPerPixelX) * Ratio
pHeight = ((pHeight * 1440) / Screen.TwipsPerPixelY) * Ratio
DesthDC = ObjPrint.hDC
End If
BitmapInfo.BitmapInfoHea der.biSize = 40
BitmapInfo.BitmapInfoHea der.biWidth = picSource.ScaleWidth
BitmapInfo.BitmapInfoHea der.biHeight = picSource.ScaleHeight
BitmapInfo.BitmapInfoHea der.biPlanes = 1
BitmapInfo.BitmapInfoHea der.biBitCount = 8
BitmapInfo.BitmapInfoHea der.biCompression = BI_RGB
' Enter the following two lines as one, single line:
hMem = GlobalAlloc(GMEM_MOVEABLE, (CLng(picSource.ScaleWidth + 3) \ 4) * 4 * picSource.ScaleHeight) &n bsp; 'DWORD ALIGNED
lpBits = GlobalLock(hMem)
' Enter the following two lines as one, single line:
r = GetDIBits(picSource.hDC, picSource.Image, 0, picSource.ScaleHeight, lpBits, BitmapInfo, DIB_RGB_COLORS)
If r <> 0 Then
' Enter the following two lines as one, single line:
r = StretchDIBits(DesthDC, pLeft, pTop, pWidth, pHeight, 0, 0, picSource.ScaleWidth, picSource.ScaleHeight, lpBits, BitmapInfo, DIB_RGB_COLORS, SRCCOPY)
End If
r = GlobalUnlock(hMem)
r = GlobalFree(hMem)
If toview = False Then
Printer.ScaleMode = 5 'Inches
Else
ObjPrint.ScaleMode = 5 'Inches
'ObjPrint.Scale (0, 0)-(PgWidth, PgHeight)
End If
End Sub
Public Sub NewPage()
If toview = False Then
Printer.NewPage
Else
ObjPrint.Cls
End If
End Sub
Public Sub DrawCircle(ByVal bLeft As Single, ByVal bTop As Single, ByVal bRadius As Single)
' If PrinterFlag Then
' Printer.Circle (bLeft - LRGap, bTop - TBgap), bRadius
' Else
' ObjPrint.Circle (bLeft, bTop), bRadius
' End If
End Sub
Public Sub DrawFilledBox(ByVal bLeft As Single, ByVal bTop As Single, ByVal bWidth As Single, ByVal bHeight As Single, ByVal Color As Long)
If toview = False Then
' Enter the following two lines as one, single line:
Printer.Line (bLeft - LRGap, bTop - TBgap)-(bLeft + bWidth - LRGap, bTop + bHeight - TBgap), Color, BF
Else
' Enter the following two lines as one, single line:
ObjPrint.Line (bLeft, bTop)-(bLeft + bWidth, bTop + bHeight), Color, BF
End If
End Sub
Public Sub DrawBox(ByVal bLeft As Single, ByVal bTop As Single, ByVal bWidth As Single, ByVal bHeight As Single)
If toview = False Then
' Enter the following two lines as one, single line:
Printer.Line (bLeft - LRGap, bTop - TBgap)-(bLeft + bWidth - LRGap, bTop + bHeight - TBgap), , B
Else
ObjPrint.Line (bLeft, bTop)-(bLeft + bWidth, bTop + bHeight), , B
End If
End Sub
Public Sub DrawLine(ByVal bLeft0 As Single, ByVal bTop0 As Single, ByVal bLeft1 As Single, ByVal bTop1 As Single, Optional Color As Long = 0, Optional LineWidth As Long = 1)
Dim oldDrawWidth As Long
If toview = False Then
' Enter the following two lines as one, single line:
oldDrawWidth = Printer.DrawWidth
Printer.DrawWidth = LineWidth
Printer.Line (bLeft0 - LRGap, bTop0 - TBgap)-(bLeft1 - LRGap, bTop1 - TBgap), Color
Printer.DrawWidth = oldDrawWidth
Else
oldDrawWidth = ObjPrint.DrawWidth
ObjPrint.DrawWidth = LineWidth
ObjPrint.Line (bLeft0, bTop0)-(bLeft1, bTop1), Color
ObjPrint.DrawWidth = oldDrawWidth
End If
End Sub
Public Sub PrintString(ByVal str As String)
If toview = False Then
Printer.Print str
Else
ObjPrint.Print str
End If
End Sub
Public Property Let FontSize(ByVal vData As Single)
'向属性指派值时使用,位于赋值语句的左边。
'Syntax: X.FontSize = 5
mvarFontSize = vData
If toview = False Then
Printer.FontSize = vData
Else
' Sized by ratio since Scale method does not effect FontSize:
ObjPrint.FontSize = vData * Ratio
End If
End Property
Public Property Get FontSize() As Single
'检索属性值时使用,位于赋值语句的右边。
'Syntax: Debug.Print X.FontSize
If toview = False Then
FontSize = Printer.FontSize
Else
FontSize = ObjPrint.FontSize / Ratio
End If
End Property
Public Property Let FontName(ByVal vData As String)
'向属性指派值时使用,位于赋值语句的左边。
'Syntax: X.FontName = 5
mvarFontName = vData
If toview = False Then
Printer.FontName = vData
Else
ObjPrint.FontName = vData
End If
End Property
Public Property Get FontName() As String
'检索属性值时使用,位于赋值语句的右边。
'Syntax: Debug.Print X.FontName
If toview = False Then
FontName = Printer.FontName
Else
FontName = ObjPrint.FontName
End If
End Property
Public Property Let CurrentY(ByVal vData As Single)
mvarCurrentY = vData
If toview = False Then
Printer.CurrentY = vData - TBgap
Else
ObjPrint.CurrentY = vData
End If
End Property
Public Property Get CurrentY() As Single
If toview = False Then
CurrentY = Printer.CurrentY + TBgap
Else
CurrentY = ObjPrint.CurrentY
End If
End Property
Public Property Let CurrentX(ByVal vData As Single)
mvarCurrentX = vData
If toview = False Then
Printer.CurrentX = vData - LRGap
Else
ObjPrint.CurrentX = vData
End If
End Property
Public Property Get CurrentX() As Single
If toview = False Then
CurrentX = Printer.CurrentX + LRGap
Else
CurrentX = ObjPrint.CurrentX
End If
End Property
Public Property Let bottomGap(ByVal vData As Single)
mvarbottomGap = vData
End Property
Public Property Get bottomGap() As Single
bottomGap = mvarbottomGap
End Property
Public Property Let topGap(ByVal vData As Single)
mvartopGap = vData
End Property
Public Property Get topGap() As Single
topGap = mvartopGap
End Property
Public Property Let rightGap(ByVal vData As Single)
mvarrightGap = vData
End Property
Public Property Get rightGap() As Single
rightGap = mvarrightGap
End Property
Public Property Let leftGap(ByVal vData As Single)
mvarleftGap = vData
End Property
Public Property Get leftGap() As Single
leftGap = mvarleftGap
End Property
Public Property Let paperSize(ByVal vData As mg_paperSizeList)
On Error GoTo errout
mvarpaperSize = vData
errout:
End Property
Public Property Get paperSize() As Long
'
End Property
Public Property Let Orientation(ByVal vData As Long)
mvarOrientation = vData
End Property
Public Property Get Orientation() As Long
Orientation = mvarOrientation
End Property
Public Property Get Font() As StdFont
'
End Property
Public Property Let Font(ByVal vNewValue As StdFont)
If toview = False Then
Printer.FontSize = vNewValue.Size
Printer.FontName = vNewValue.name
Printer.FontBold = vNewValue.Bold
Printer.FontUnderline = vNewValue.Underline
Printer.FontItalic = vNewValue.Italic
Else
ObjPrint.FontSize = vNewValue.Size * Ratio
ObjPrint.FontName = vNewValue.name
ObjPrint.FontBold = vNewValue.Bold
ObjPrint.FontUnderline = vNewValue.Underline
ObjPrint.FontItalic = vNewValue.Italic
End If
'Debug.Print "inclass " & vNewValue.Size
End Property
Public Property Set Font(ByVal vNewValue As StdFont)
If toview = False Then
Printer.FontSize = vNewValue.Size
Printer.FontName = vNewValue.name
Printer.FontBold = vNewValue.Bold
Printer.FontUnderline = vNewValue.Underline
Printer.FontItalic = vNewValue.Italic
Else
ObjPrint.FontSize = vNewValue.Size * Ratio
ObjPrint.FontName = vNewValue.name
ObjPrint.FontBold = vNewValue.Bold
ObjPrint.FontUnderline = vNewValue.Underline
ObjPrint.FontItalic = vNewValue.Italic
End If
'Debug.Print "inclass " & vNewValue.Size
End Property
Public Property Get PaperHeight() As Single
PaperHeight = m_PaperHeight
End Property
Public Property Let PaperHeight(ByVal vNewValue As Single)
m_PaperHeight = vNewValue
End Property
Public Property Get PaperWidth() As Single
PaperWidth = m_PaperWidth
End Property
Public Property Let PaperWidth(ByVal vNewValue As Single)
m_PaperWidth = vNewValue
End Property
正文
该模块用于打印2005-09-25 22:55:00
【评论】 【打印】 【字体:大 中 小】 本文链接:http://blog.pfan.cn/iamben250/5342.html
阅读(3224) | 评论(0)
版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!
评论