例如我在窗体上放一个Frame1控件,再在Frame1中放若干个text、check、label、line控件,怎样实现打印frame1中的全部内容(原样输出,即原位置不变),如果换成打印窗体上的全部内容呢!
    如果我的窗体上放一个DataGrid1控件,怎样原样打印出DataGrid的全部内容,包括:标题(caption)、列标题等!!!
    如果是横向用A4打印上方内容,怎样控制打印用纸的大小,如果连续打印,怎样判断缺纸,或控制换纸

解决方案 »

  1.   

    用bitblt函数通过frame.hdc画到picbox/printer里面
      

  2.   

    datagrid 有个属性,专门支持打印的。这个很容易的。可是,问题是你为什么不用报表来实现呢,
    可以把你要打印的内容放在excel里啊。那样控制起来好一些,打印纸的问题也可以 自然解决了,可以自动调用windows里的东西,
      

  3.   

    to:nik_Amis(Azrael)
       能不能说详细些.to:liaoliao315(了了)
       怎么样用报表来实现呢,我没有用过报表,能不能说详细些.
      

  4.   

    如果用form.print方法,应该可以把窗体原样输出,至于报表,你也可以用水晶报表,蛮专业的嘛,以后说起来也是脸上有光的,就是做模板麻烦点,呵呵。
      

  5.   

    没有的事,谁说不用外部控件就不行?
    两种方法
    1、不要求打印质量,用printform,但如果大于屏幕大小,窗体一定要为MDI子窗体才行
    2、要求质量,取得Frame上的所有控件,用API画到Picture上,打印Picture内容。
    至于Bitblt,Stech等等方法,不建议使用,那东东太差。
    第一种方法很容易实现,第二种方法要自己写些函数,以前有过这样的贴子
      

  6.   

    其实你说的功能不用外部控件也可以解决,就是只用VB也可以解决,我以前都碰到过,窗体直接打印就用我上面说的办法,DATAGRID自己也有支持打印的方法,只是挺粗糙,功能和控制都差强人意。至于判断缺纸,你得去读串口,取得打印机的状态字。一般在打印的说明书上都应该有不同状态所对应的不同状态字,比如缺纸了,打印机就返回一个12(只是举例,我也不记得是多少了),告诉计算机现在缺纸,你可以用那个,好象是COMM控件来读到这个消息。我已经好久不用VB了,记不大清,不好意思:-)
      

  7.   


    AddForm VB声明 
    Declare Function AddForm& Lib "spoolss.dll" Alias "AddFormA" (ByVal hPrinter As Long, ByVal Level As Long, pForm As FORM_INFO_1) 
    说明 
    为打印机的表单列表添加一个新表单。“表单”描述了一个页面大小及布局,提供了一种与设备无关的机制,可实现Windows NT下的纸张尺寸的标准化 
    返回值 
    Long,非零表示成功,零表示失败。会设置GetLastError 
    参数表 
    参数 类型及说明 
    hPrinter Long,一个已打开的打印机对象的句柄(用OpenPrinter获得) 
    Level Long,设为1 
    pForm FORM_INFO_1,对表单进行描述的一个结构 
    适用平台 
    Windows NT
     
    其他 
    在VB的API文本查看器里复制的声明如下:
    Declare Function AddForm Lib "winspool.drv" Alias "AddFormA" (ByVal hPrinter As Long, ByVal Level As Long, pForm As Byte) As Long 
    从应用程序中打印Visual Basic 为打印正文和图形提供了三种技术。 可在窗体中建立所需要的输出,然后用 PrintForm 方法打印窗体。
    通过设置 Printers 集合中的缺省的打印机,可传送正文和图形到打印机。
    可先传送正文和图形给 Printer 对象,再用 NewPage 和 EndDoc 方法打印。 
    这部分将探讨以上三种方法的优缺点。使用 PrintForm 方法
    PrintForm 方法将指定窗体的图象传送到打印机。要用 PrintForm 方法打印应用程序中的信息,需先将该信息显示在窗体中,然后再用 PrintForm 打印窗体。语法如下所示:[form.]PrintForm若省略窗体名称,则 Visual Basic 打印当前窗体。PrintForm 打印窗体的全部内容,即使窗体的某部分在屏幕上见不到。若窗体中包含图形,只有当 AutoRedraw 属性设置为 True 时,才能将图形打印出来。打印结束后,PrintForm 调用 EndDoc 方法清空打印机。例如,可通过将正文显示在屏幕上的方法,把正文传送到打印机,然后用下列语句调用 PrintForm 方法:Print "Here is some text."
    PrintFormPrintForm 方法是应用程序打印的最简便的方法。因为它可按用户屏幕的分辨率传送信息到打印机(每英寸打印 96 点),即使打印机有更高的分辨率(对于激光打印机,每英寸打印 300 点),结果也不会更好。结果根据窗体中的对象可以变化。详细信息 请参阅《语言参考》的“PrintForm 方法”。使用打印机集合
    打印机集合是一个包括操作系统中所有可用打印机的对象。打印机列表与打印安装对话框或 Windows“控制面板”中的那些有效内容相同。打印机集合中的每台打印机有唯一索引定义。索引从 0 开始,每台打印机都可根据索引编号来引用。不论用何种打印方法,所有 Visual Basic 应用程序打印输出的内容,都直接指向 Printer 对象,它最初时代表 Windows“控制面板”中指定的缺省打印机。不过,也可把 Printers 集合中的任意一台设置为缺省打印机。使用下列语法,可从打印机集合中选择打印机:Set Printer = Printers(n)下列语句打印操作系统中所有打印机的设备名称到“立即”窗口中:Private Sub Command1_Click()
    Dim x As Printer
       For Each x In Printers
          Debug.Print x.DeviceName
       Next
    End Sub注意 不能在代码中创建新的 Printer 对象实例,也不能在 Printers 集合中直接添加或删除打印机。要在系统中添加或删除打印机,应使用 Windows“控制面板”。使用 Printer 对象
    Printer 对象是一个与设备无关的图片空间,支持用 Print、PSet、Line、PaintPicture 和 Circle 方法来创建文本和图形。只有在窗体或图片框中,才能将这些方法用于 Printer 对象。Printer 对象也包括本章前面所描述的所有字体属性。当完成在 Printer 对象中放置信息后,用 EndDoc 方法将输出传送到打印机。每次应用程序结束时,它们会自动使用 EndDoc 方法,将打印机对象中任何未确定的信息送到打印机。对于各种不同的打印机,Printer 对象提供最好的打印质量,因为 Windows 在 Printer 对象设备无关的图片空间中,将文本和图形与打印机的分辨率和功能进行了最佳的匹配。也可在打印机对象中使用 NewPage 方法来打印多页文档。使用 Printer 对象的主要缺点,是取得最佳结果所需要的代码量较大。在 Printer 对象中打印位图也要花费时间,因此会降低应用程序的性能。