公司需要打印一种特别的纸卡,该纸卡的顶部要先贴样布,然后在样布下面的表格打印文字。
如果纸卡贴样布的地方在下面而不在顶部,那么就可以非常轻松地在打印出来
现在需要想办法让程序将打印内容旋转180度后再打印。我想用水晶报表来打印,但是不知道这么设置。
在网上找了没找到,不知各位可否告知,又或者提供一个思路?

解决方案 »

  1.   

    如果你比较熟悉VB的PRINTER对象操作,可调用API函数进行字符旋转打印,参考一下老外写的如下代码:
    Dim mstrContent()     As String
    Dim mintPage()     As Integer
    Dim mlngArrID()     As Long
    Dim mbKeyPress     As Boolean
    Dim mMaxPages     As Integer
    Dim mblnChecked()     As Boolean
    Dim mlngSelArchID     As Long
    Dim mblnItemClick     As Boolean
    Dim mintItemSelect     As Integer
    Dim mlngItemID     As Long
    Dim mbChecked     As Boolean
    Dim mstrSelArchNo     As String
    Dim mlngArchID()     As Long
    Dim mLngCnnID()     As Long
    Private Const LF_FACESIZE = 32
    Private Type LOGFONT
          lfHeight   As Long
          lfWidth   As Long
          lfEscapement   As Long
          lfOrientation   As Long
          lfWeight   As Long
          lfItalic   As Byte
          lfUnderline   As Byte
          lfStrikeOut   As Byte
          lfCharSet   As Byte
          lfOutPrecision   As Byte
          lfClipPrecision   As Byte
          lfQuality   As Byte
          lfPitchAndFamily   As Byte
          lfFaceName   As String * LF_FACESIZE
    End Type
    Private Type DOCINFO
          cbSize   As Long
          lpszDocName   As String
          lpszOutput   As String
          lpszDatatype   As String
          fwType   As Long
    End Type
    Private Declare Function CreateFontIndirect Lib "gdi32" Alias "CreateFontIndirectA" (lpLogFont As LOGFONT) As Long
    Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
    Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
    Private Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" _
    (ByVal lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As Long, ByVal lpInitData As Long) As Long
    Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
    Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, _
    ByVal lpString As String, ByVal nCount As Long) As Long                     '   or   Boolean
    Private Declare Function StartDoc Lib "gdi32" Alias "StartDocA" (ByVal hdc As Long, lpdi As DOCINFO) As Long
    Private Declare Function EndDoc Lib "gdi32" (ByVal hdc As Long) As Long
    Private Declare Function StartPage Lib "gdi32" (ByVal hdc As Long) As Long
    Private Declare Function EndPage Lib "gdi32" (ByVal hdc As Long) As Long
    Const DESIREDFONTSIZE = 12                 '   Could   use   variable,   TextBox,   etc.
    Private Sub Command1_Click()
                '使用API函数打印
                Dim OutString     As String       'String   to   be   rotated
                Dim lf     As LOGFONT                   'Structure   for   setting   up   rotated   font
                Dim temp     As String                 'Temp   string   var
                Dim result     As Long                 'Return   value   for   calling   API   functions
                Dim hOldfont     As Long             'Hold   old   font   information
                Dim hPrintDc     As Long             'Handle   to   printer   dc
                Dim hFont     As Long                   'Handle   to   new   Font
                Dim di     As DOCINFO                   'Structure   for   Print   Document   info
                OutString = "测试字符1234564"           'Set   string   to   be   rotated
          '   Set   rotation   in   tenths   of   a   degree,   i.e.,   1800   =   180   degrees
                lf.lfEscapement = 1800 '旋转180度,也可设置为900、2700
                lf.lfHeight = (DESIREDFONTSIZE * -20) / Printer.TwipsPerPixelY
                hFont = CreateFontIndirect(lf)         'Create   the   rotated   font
                di.cbSize = 20                                         '   Size   of   DOCINFO   structure
                di.lpszDocName = "My   Document"       '   Set   name   of   print   job   (Optional)
          '   Create   a   printer   device   context
                hPrintDc = CreateDC(Printer.DriverName, Printer.DeviceName, 0, 0)
                result = StartDoc(hPrintDc, di)         'Start   a   new   print   document
                result = StartPage(hPrintDc)             'Start   a   new   page
          '   Select   our   rotated   font   structure   and   save   previous   font   info
                hOldfont = SelectObject(hPrintDc, hFont)
          '   Send   rotated   text   to   printer,   starting   at   location   1000,   1000
                result = TextOut(hPrintDc, 2000, 1000, OutString, LenB(StrConv(OutString, vbFromUnicode)))
          '不旋转打印
                result = SelectObject(hPrintDc, hOldfont)
          '   Send   non-rotated   text   to   printer   at   same   page   location
                result = TextOut(hPrintDc, 1000, 1000, OutString, LenB(StrConv(OutString, vbFromUnicode)))
                result = EndPage(hPrintDc)                 'End   the   page
                result = EndDoc(hPrintDc)                   'End   the   print   job
                result = DeleteDC(hPrintDc)               'Delete   the   printer   device   context
                result = DeleteObject(hFont)             'Delete   the   font   object
    End Sub
      

  2.   

    其实也有个比较简单的解决方案:先把要输出的东西打印到一个PICTURE控件上,然后将PICTURE控件上的图片水平翻转一次,再垂直翻转一次,这就是旋转180度了,转好之后按照图形方式打印出来. 反正图片上的白色部分是不会打印出来的.而你得到的就是旋转180度的字体了.PICTURE控件自带的PAINTPICTURE方法就可以实现翻转(MSDN上有详细说明)
    记得从PICTURE控件打印到打印机也可以用PAINTPICTURE这个命令, 这样的话,你只要在控件上先一个方向翻转一次,输出的时候再另一个方向翻转一次,就可以了
      

  3.   

    补充楼上,
    只要你在图片上输出的时候先考虑好位置,就一定可以实现你的要求,又不用一个API, 纯技巧解决方案
      

  4.   


    谢谢你的回答,这个思路我也考虑过,之前也用PICBOX做过位图旋转,不过效率太低了,因为打印区域比A4纸还要大些,位图旋转消耗的时间相对来说太长了。因为一般打印纸卡都是大量一次性打印,所以必须考虑效率问题再次谢谢你的关注和回复!
      

  5.   

    HP1020驱动程序打印默认模式  模式  介质  
    PLAIN(普通纸)  75 至 104 g/m2 
    LIGHT(轻磅)  < 75 g/m2 
    HEAVY(重磅)  90 至 105 g/m2 
    CARDSTOCK(卡片纸)  卡片纸或重磅介质  
    TRANSPARENCY(投影胶片)  4-mil、0.1 单色投影胶片 (Monochrome Overhead Transparencies,OHT)  
    ENVELOPE(信封)  标准信封  
    LABEL(标签)  标准 HP LaserJet 标签  
    BOND(证券纸)  证券纸  
    ROUGH(粗糙纸)  粗糙纸  
    COLOR(彩色纸)  普通介质  
    LETTERHEAD(信头纸)  普通介质  
    PREPRINTED(预打印纸)  普通介质  
    PREPUNCHED(预穿孔纸)  普通介质  
    RECYCLED(再生纸)  普通介质  
    VELLUM(硫酸纸)  普通介质  --------------------------------------------------------------------------------
      

  6.   

    TO 楼主, 180度"旋转" 其实只要两次翻转就可以了, 图像翻转和旋转是绝对不同的事, 翻转的速度比旋转要快N百倍, 不信你去MSDN上看看PAINTPICTURE这个方法的示例