还是打印预览,被要求做一个类,它的属性和方法同PRINTER一样,区别是:
printer.print输出到打印机
newClass.print 输出到一个picturebox,实现模拟真实打印的效果。
程序我已经写好了,只是不明白在VB里怎么创建这么一个类???在类模块里添加print报错,top,left,width,height也一样。
或者创建这么一个控件也行,但怎么做呢???
printer.print输出到打印机
newClass.print 输出到一个picturebox,实现模拟真实打印的效果。
程序我已经写好了,只是不明白在VB里怎么创建这么一个类???在类模块里添加print报错,top,left,width,height也一样。
或者创建这么一个控件也行,但怎么做呢???
Dim mcolRows As New Collection '定义行字符串的集合
Dim Rows As Long '表达行数的变量
Dim rowtxt As Variant '枚举算子
Dim mcolPages() As New Collection
Dim mstrPage As Variant '枚举算子
Dim Pages As Long '打印页数统计变量
Dim pageNum As Long '表达当前打印预览页数的变量Private Sub Form_Load()
fmPreview.ScaleMode = 1 '设置窗体的坐标单位:缇
picBottom.ScaleMode = 1 '设置底层Picturebox的坐标单位:缇
picBottom.Top = 0 '设置底层picturebox的位置
picBottom.Left = 0
VScroll1.Max = picBottom.Height '设置垂直滚动条的最大值
VScroll1.Height = fmPreview.Height '设置垂直滚动条的尺寸和位置参数
VScroll1.Top = 0
VScroll1.Left = fmPreview.Width - VScroll1.Width + 567
Picture1.ScaleMode = 1 '设置预览用picturebox的坐标单位:缇
Picture1.AutoRedraw = True '设置预览用picturebox为可写
Picture1.Width = PAPERW '设置预览用picturebox的宽为A4纸的宽度
Picture1.Top = 0 '设置预览用picturebox的位置
Picture1.Left = 0
Picture1.Font.Name = fmMain.Text1.Font.Name '保持预览文本和输入文本的字体及字号一致
Picture1.Font.Size = fmMain.Text1.Font.Size
Picture1.CurrentX = LeftM '设置预览用picturebox的打印起始点
Picture1.CurrentY = TopM
picBottom.Width = Picture1.Width '保持底层picturebox的尺寸和预览用picturebox的尺寸一致
picBottom.Height = Picture1.Height
WidthM = PAPERW - LeftM - RightM
HeightM = PAPERH - TopM - BottomM
pageNum = 1
mstrText = fmMain.Text1.Text '将预览文本内容传入
changeRow '对输入文本分行
changePage '对输入文本分页
printPage (pageNum) '实现预览(分段输出)
VScroll1.ZOrder
End Sub
Private Sub Form_Resize() '窗体尺寸改变时保证内部控件尺寸随之改变
VScroll1.Min = 0
VScroll1.Top = 0
VScroll1.Left = fmPreview.Width - VScroll1.Width
VScroll1.Height = fmPreview.Height
picBottom.Width = PAPERW
picBottom.Height = fmPreview.Height
VScroll1.ZOrder
End SubPrivate Sub munNext_Click()
If pageNum > Pages - 1 Then
MsgBox ("已至最后一页")
Else
pageNum = pageNum + 1
printPage (pageNum)
End If
End SubPrivate Sub VScroll1_Change()
Picture1.Top = 0 - VScroll1.Value * 2
End Sub
Private Sub changeRow() '实现换行的子程序
Dim i As Long '控制循环参数
Dim d As Long '控制行的字符数
Dim temptxt As String
Dim rowtxtstr As String '字符串转换用变量
Rows = 1
rowtxtstr = ""
For i = 1 To Len(mstrText) '实现换行
rowtxtstr = rowtxtstr + Mid(mstrText, i, 1)
d = d + 1
If Mid(mstrText, i, 1) = vbCr And Mid(mstrText, i + 1, 1) = vbLf Then 'Mid(mstrText, i, 1) = vbCrLf Then '遇到文本段落换行处的换行处理
rowtxtstr = Replace(rowtxtstr, vbCrLf, "") '删除所有的回车符和换行符
rowtxtstr = Left(rowtxtstr, d - 1)
mcolRows.Add rowtxtstr
i = i + 1
Rows = Rows + 1
rowtxtstr = ""
d = 0
ElseIf Picture1.TextWidth(rowtxtstr) > WidthM Then '实现行文本长度超过打印范围的换行处理
rowtxtstr = Left(rowtxtstr, d - 1)
mcolRows.Add rowtxtstr
Rows = Rows + 1
rowtxtstr = ""
d = 0
i = i - 1
End If
Next
mcolRows.Add rowtxtstr
End Sub
Private Sub printRow(i As Long) '实现分行输出的子程序
Dim rowtxtstr As Variant
pictureResize
For Each rowtxtstr In mcolPages(i - 1)
Picture1.CurrentX = LeftM '设置打印左边界
Picture1.Print rowtxtstr
Next
End Sub
Private Sub pictureResize()
Picture1.Height = PAPERH
picBottom.Height = fmPreview.Height
VScroll1.Max = picBottom.Height
End Sub
Private Sub changePage() '实现换页的子程序
Dim i As Long '循环控制因子
Dim j As Long '循环控制因子
Dim PageRows As Long
Dim txtPage As String '由行向页转换时用于传值
Pages = 1
For i = 1 To Rows
txtPage = txtPage + mcolRows.Item(i) + vbCrLf
ReDim Preserve mcolPages(Pages)
mcolPages(Pages - 1).Add mcolRows.Item(i)
PageRows = PageRows + 1
If Picture1.TextHeight(txtPage) > HeightM Then
mcolPages(Pages - 1).Remove PageRows
PageRows = 0
txtPage = ""
Pages = Pages + 1
i = i - 1
End If
Next
End Sub
Private Sub printPage(p As Long) '实现文本的分页打印预览
Dim i As Long
pictureResize
Picture1.Cls
Picture1.CurrentY = TopM '(i - 1) * HeightM + (2 * i - 1) * 567
printRow (p)
End Sub就是用一个类代替以上功能,实现用newClass.print 就可以实现在一个picturebox上预览打印效果,要求用起来和printer一样。
你在函数在加一个表示对象的参数,如:Function MyPrint(.....,P as Object)。
在函数中用P代替Printer。
在需要换页时可以用 typeof p is picturebox 来判断是打印还是预览,然后做相应的处理。打印时 MyPrint .....,Printer
预览时 MyPrint .....,Picture
如你新建一DLL工程(Prg),类名为Test,方法为DoPrint,则调用时:
dim obj as new Prg.Test
obj.DoPrint ... (有可能有参数)建议:赶快看看Msdn
但在类模块里,用doprint,myprint做方法名都是可以的,我昨天已经实现。是不是不能用print作方法名?属性名有一些也不能用。是类本身自动带有哪些属性和方法呢还是VB的限制????
我被要求实现newclass.print是否不能做到????