还是打印预览,被要求做一个类,它的属性和方法同PRINTER一样,区别是:
printer.print输出到打印机
newClass.print 输出到一个picturebox,实现模拟真实打印的效果。
程序我已经写好了,只是不明白在VB里怎么创建这么一个类???在类模块里添加print报错,top,left,width,height也一样。
或者创建这么一个控件也行,但怎么做呢???

解决方案 »

  1.   

    好吧,我贴部分我测试用的代码上来。这段代码可以实现对纯文本的打印预览(在picture1上表示),还没有做其他处理(比如标点符号问题)。Option ExplicitDim mstrText        As String         '定义用于存放预览文本内容的字符变量
    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一样。
      

  2.   

    把所有的Printer换成Picture就是在在Picture上预览了。一般打印和预览可以用一个函数来实现。
    你在函数在加一个表示对象的参数,如:Function MyPrint(.....,P as Object)。
    在函数中用P代替Printer。
    在需要换页时可以用 typeof p is picturebox 来判断是打印还是预览,然后做相应的处理。打印时 MyPrint .....,Printer
    预览时 MyPrint .....,Picture
      

  3.   

    能不能具体些?类模块的声明部分怎么写????用函数实现我也能做到,可是要求我用类,而且还有可能要求做成公用控件(ActiveX)。一并回答了吧,谢谢了。
      

  4.   

    你添加一类模块就行了,再把你的过程放进去。
    如你新建一DLL工程(Prg),类名为Test,方法为DoPrint,则调用时:
    dim obj as new Prg.Test
    obj.DoPrint ... (有可能有参数)建议:赶快看看Msdn
      

  5.   

    谢谢niqiu(一不留神,老了!) qbilbo(风之兄)
    但在类模块里,用doprint,myprint做方法名都是可以的,我昨天已经实现。是不是不能用print作方法名?属性名有一些也不能用。是类本身自动带有哪些属性和方法呢还是VB的限制????
    我被要求实现newclass.print是否不能做到????
      

  6.   

    是的,Print 是VB的保留字,是不能做方法或性名的
      

  7.   

    是的,我也是刚刚知道的,要求已经改了,谢谢niqiu(一不留神,老了!) 。我再试一试,有问题继续请教,搞定后结贴。哎呀,分不多了啊~~~~~~~~~