精华内容
下载资源
问答
  • 打印机编程

    千次阅读 2013-07-19 10:59:56
    1.1--打印机编程  1.1 .1 打印机介绍 1.打印术语  cpi(characters Per Inch) 每英寸内所含的字符数,用来表示字符的大小、  间距。  cpl(Characters Per Line) 每行中所含的字符个数,用来在横向表示...
    1.1--打印机编程 
    1.1 .1 打印机介绍


    1.打印术语
       cpi(characters Per Inch) 每英寸内所含的字符数,用来表示字符的大小、
       间距。
       cpl(Characters Per Line) 每行中所含的字符个数,用来在横向表示字符
       的宽度和间距。
       cps(Character Per Second):每秒所能打印的字符个数,用来表示打印机的打
       印速度。当然它和打印的字符大小与笔划有关。一般以10cpi的西文字符为基准
       来计算打印速度.
       dpi(Dot Per Inch)每英寸所打印的点数(或线数),用来表示打印机打印分辨.这是
       衡量打印机打印精度的主要参数之一.该值越大表明打印机的打印精度越高.
       lpi(Lines Per Inch): 每英寸所含的行数,用来表示在垂直方向字符的大小
       间距.
       ppm(Papers Per Minute):每分钟打印的页数,这是衡量打印机打印速度的
       重要参数,是指连续打印时的平均速度.
       
       在大多数的Internet及多媒体应用软件中,为使画面下载速度增快,大都是采
       用72dpi或75dpi的低解析度影像,如果仅从屏幕上观看,画质还可以,但是当
       使用解析度较高的打印机打印出来时,就会发生如锯齿状或是模糊不清的问题.
       这主要的原因在于原始影像本身的像素不能呈现高解析度的输出品质.
       因此,无论使用的打印机品质或解析度多高,打印品质仍不理想.使用HP SmartFocus
       智慧聚焦技术的打印机驱动程序,将低品质的影像自动地做解析度提升的处理.
       这样一来,就可以打印出较清晰的影像.
       
       sRGB:(standard Red Green Blue)是一种彩色语言协定.它提供了一个标准方法来定义
       色彩.让计算机的周边设备与应用软件对于色彩有一个共通的语言.sRGB是由HP和微软
       共同推出的开放业界标准.


    2.打印机技术指标
      (1) 打印质量
      衡量图像清晰程度最重要的指标就是分辨率(dpi每平方英寸多少个点).
      300dpi是人眼分辨打印文本与图像的边缘是否有锯齿的临界点.再考虑
      到其他的一些因素,只有360dpi以上的打印效果才能基本令人满意.要将
      基色组成的色点转换成印刷上由四色墨水喷出的各种色彩效果,就需要
      由色彩转换的驱动程序来实现.目前各打印机厂商均有自已的图像调整技术.
      
      (2)打印速度
      打印机的打印速度是每分钟打印多少页纸(PPM),打印机速度与打印的色彩和
      打印分辨有关.
      
      (3)色彩数目
      更多的彩色墨盒数就意味着更丰富的色彩.有红、黄、蓝三色单墨盒。还有
      黑、淡蓝和淡红的六色打印机。
      
      1.1.2 分辨率
      分辨率是一个表示平面图像精细程序的概念,通常它是以横向和纵向点的数量来衡量的,
      表示成:水平点数*垂直点数的形式.在一个固定的平面内,分辨率越高,图像越细致.
      分辨率有多种.在显示器上有表示显示精度的显示分辨率,在打印机上有表示打印精度的
      打印机分辨率.
      
      1、显示分辨率
      显示分辨率是显示器在显示图像时的分辨率。显示分辨率的数值是指整个显示器所有
      可视面积上水平像素和垂直像素的数量.例如:800*600的分辨率是指在整个屏幕上水平
      显示800个像素,垂直显示600个像素.显示分辨率的水平像素和垂直像素的总数总是成一
      定的比例:一般为4:3,5:4,8:5
      
      2、打印机分辨率
      打印机分辨率直接关系到打印机输出图像或文字的质量好坏。打印机分辨率用dpi(dot per inch)
      来表示。喷墨打印机和激光打印机的分辨率通常是相同的.例如:打印机分辨率为600dpi,
      是指打印机在一平方英寸的区域内垂直打印600个点,水平打印600个点.总共可打印360000个点.






    1.2--打印机编程基础(未完) 
    1.2编程基础
      下面将了解打印编程中至关重要的两个概念"设备环境"和"映射模式"
      1.2.1设备环境
      设备环境本身是GDI(Graphics Device interface)对象.每个C++设备对象有一个相关的设备环境.它由
      一个32位HDC类型句柄来标识.GDI是Windows核心DLL中的一组接口函数.这些函数处于硬件的驱动程序
      之上.当应用程序调用这些函数的时候,它们再调用驱动程序提供的接口函数.
      
      1.CDC类
      使用MFC编程,所用的设备环境不是CDC就是从CDC派生的。CDC类中有两个与底层
      GDI对象有关的句柄m_hDC和m_hAttribDC.与m_hDC相关的GDI对象处理绘图函数的所有
      输出流;与m_hAttribDC句柄有关的GDI对象处理所有与绘图属性有关的操作。如颜色属性
      和绘图模式。
      
      每个窗口、控件都拥有一个覆盖窗口或控件的设备环境。我们可以使用任何一个控件的设备环境,
      从而绘制控件或者改善倥件的外观。
      
      获得设备环境对象指针需要调用GetDC函数。在构造一个CDC对象,并且对它处理完之后,务必使用
      ReleaseDC()函数将CDC对象释放。
      
      GetDC()函数和ReleaseDC()函数是CWnd类的成员函数,任何CWnd类及其派生类都可以通过调用它获得
      和释放设备环境对象。
      
      2. CClientDC和CWindowDC
      窗口客户区不包括边框、标题栏和菜单栏,创建CClientDC对象将获得客户区的设备
      环境。构造CClientDC对象,只需要向它传递一个指向窗口的指针,GetDC()函数会被
      自动调用。当ClientDC对象被销毁时,它会自动调用ReleaseDC()函数。
      
      CClientDC派生于CDC,在构造时调用了Windows函数GetDC,在析构时调用了ReleaseDC.
      和CClientDC对象相关的设备上下文是窗口的客户区.
      
      CClientDC 构造一个连接到CWnd上的CClientDC对象.
      CClientDC(CWnd *pWnd);
      throw (CResourceException);
      参数:
      pWnd:设备上下文将要存取的客户区所在的窗口.
      
      CWindowDC能够在整个应用程序窗口上绘图,包括标题栏和窗口边框。一般情况下CWindowDC
      对象很少用,但是当读者不欢喜Windows标准窗口标题栏的样式和按钮,就可以应用它了。
      
      CWindowDC类是从CDC继承的,它在构造的时候调用Windows函数GetWindowDC,在销毁的时候调用ReleaseDC.
      这意味着CWindowDC对象可以访问CWnd的全部屏幕区域(包括客户区和非客户区).
      
      
      AfxGetMainWnd()函数用于获得框架(包括标题栏、菜单栏、状态栏、边框)窗口的指针。
      AfxGetMainWnd()获得主框架窗口指针。
      
      
      
      3、CPaintDC
      CPaintDC类是一个特殊的设备环境封装类。它用来处理来自Windows的WM_PAINT消息。
      当窗口上覆盖的其他窗口移走,或者窗口最小化后又最大化时,窗口就会收一个系统
      发来的WM_PAINT消息,这时应用程序就会重画可见的区域。这个被重画的区域,我们称
      它为无效区域。WM_PAINT消息发出后,Windows会帮助用户判断哪些区域需要重画,哪些
      区域保持不变,从而加快窗口的显示速度。
      
      CPaintDC类有一个成员变量m_ps,m_ps有一个RECT类型的成员变量rcPaint.这个矩形变量
      保存了需要重画的矩形区域,即无效区域。m_ps是一个PAINTSTRUCT结构类型的变量。
      
      PAINTSTRUCT结构的定义如下所示:
      typedef struct tagPAINTSTRUCT
      {
         HDC hDC;
         BOOL fErase;
         RECT rcPaint;
         BOOL fRestore;
         BOOL fIncUpdate;
         byte rgbReserved[32];
      }PAINTSTRUCT;
      
      hdc是底层的GDI设备环境对象的句柄.Ferase标志判断背景是否被清除,如果这个标志
      被设置为TRUE,在重画之前将清除背景.rcPaint 保存了窗口无效区域(即需要重画的
      区域).最后三个变量被声明为保留变量.一般不改动.
      
      4、内存设备环境
      内存设备环境是一个没有设备与它联系的环境。我们一般利用与某个标准设备环境兼容
      的内存设备环境把一个位图复制到屏幕上去。为此可以先创建一个与某个标准设备环境兼容
      的内存设备环境,然后把所要显示的位图复制到内存设备环境中,最后再从内存设备环境复
      制到真正的设备环境,从而把位图显示出来。
      还可以创建内存设备环境对象,使用该对象在内存中绘图来代替在屏幕上绘图,绘制完成后,
      再调用BitBlt()函数把它复制到屏幕上去。这种方法绘图可以克服屏幕闪烁现象。
      
      CGdiObject::GetObject 把描述了将Windows GDI对象附加给CGdiObject对象的数据填充到缓冲区。
      int GetObject(int nCount,LPVOID lpObject)const;
      返回值:获取的字节数。如果发生错误,则返回0
      参数:
      nCount 指定要拷贝到lpObject缓冲区的字节数
      lpObject 指向用户应用缓冲区的指针以接收信息。
      说明:
      用定义指定对象的数据填充缓冲区。函数获得一个类型由图像对象决定
      的数据结构,列表如下所示:
      LoadBitmap  从应用的可执行文件中加载一个命名的位图资源来初始化位图对象。
      
      CDC::BitBlt 从指定设备上下文拷贝位图
      BOOL BitBlt(int x,int y,int nWidth,int nHeight,CDC *pSrcDC,int xSrc,int ySrc,DWORD dwRop);
      返回值:函数成功,返回非零值,否则为0
      
      参数:x 指定目标矩形左上角的逻辑x坐标
            y 指定目标矩形左上角的逻辑y坐标
            nWidth 指定目标矩形矩形和源位图的宽度(逻辑单位)
            nHeight 指定目标矩形和源位图的高度(逻辑单位)
            pSrcDC  指向CDC对象的指针,标识待拷贝位图的设备上下文。
            xSrc    指定源位图左上角的逻辑x坐标
            ySrc    指定源位图左上角的逻辑y坐标
            dwRop   指定要执行的光栅操作。
      CDC::CreateCompatibleDC 创建内存设备上下文,与另一个设备上下文匹配。可以
      用它在内存中准备图像。
      virtual BOOL CreateCompatibleDC(CDC *pDC);
      返回值:如果成功,则返回非零值,否则为0
      参数:
      pDC 设备上下文指针。如果pDC为NULL,函数将产生与系统兼容的内存设备上下文。
      说明:
      产生与pDC指定设备兼容的设备上下文内存,设备上下文内存包含显示表面的信息,
      它用于在向实际的兼容设备表面发送图像之前在内存中作好准备。
      
      void CPrintProjView::OnDrawBitmap()
      {
        CBitmap bitmap;
        bitmap.LoadBitmap(IDB_BITMAP1);
        BITMAP bmpInfo;
        CDC *pDC = GetDC();
        CDC memDC;
        memDC.CreateCompatibleDC();
        CBitmap *pBitmap = memDC.SelectObject(&bitmap);
        bitmap.GetObejct(sizeof(bmpInfo),&bmpInfo);
        pDC->BitBlt(0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,&memDC,0,0,SRCCOPY);
         memDC.DeleteDC();
         ReleaseDC(pDC);
      }
      上面这段程序,先获得视图的设备环境,然后声明了一个内存设备环境memDC.
      memDC调用了CreateCompatibleDC()函数,作用是设置内存设备环境的大小等各种属性,
      从而使内存设备环境与屏幕窗口兼容。Bitmap是位图对象,它调用成员函数LoadBitmap
      载入位图;bmpInfo是BITMAP结构类型的变量,它保存了位图的长、宽等信息。
      
      BitBlt()函数把内存设备环境复制到屏幕设备环境。BitBlt()是一个图像复制函数。
      当向函数传递需要复制区域的宽、高度、开始偏移和复制模式这些参数时,它会将需要复制的
      矩形区域从内存设备环境复制到屏幕上。
      
      注意:
      程序中使用的位图类型是GDI位图。有两种类型的Windows位图:GDI位图和DIB位图。
      GDI位图对象是由MFC库的CBitmap类表示的。GDI位图对象有一个与之相关的Windows
      数据结构,它在Windows GDI模块内进行维护,它是与设备相关的。对于GDI位图来说,
      显示器的“位图”实际上就是显示器表面的映像,打印机设备的“位图”是打印机本身。
      因此,不能将位图选入显示设备环境或打印设备环境,这就是为什么必须使用
      CDC::CreateCompatibleDC函数创建一个特殊的内存设备环境。
      
      5、打印机设备上下文
      CDC::CreateDC 为指定设备创建设备上下文
      virtual BOOL CreateDC(LPCTSTR lpszDriverName,
                            LPCTSTR lpszDeviceName,
                            LPCTSTR lpszOutput,
                            const void *lpInitData)
      返回值:如果成功,则返回非零值,否则为0
      参数:
      lpszDriverName:指向空终止字符串的指针,字符串为设备驱动程序的文件名(不带扩展名,
      例如:"EPSON")也可以为该参数传递CString对象。
      
      lpszDeviceName:指向空终止字符串的指针,字符串为支持特定设备的文件名(例如:
      "EPSON FX-80")
      lpszOutput:指向空终止字符串的指针。字符串为指定了物理输出媒介的文件和设备名
      (文件或输出端口).也可以为该参数传递CString对象。
      
      lpInitData:指向DEVMODE结构的指针,该结构包含有指定设备驱动程序的初始数据,Windows
      的DocumentProperties函数从该结构中获得指定设备的信息。如果设备驱动程序使用用户
      在控制面板的缺省值,lpInitData参数一定要设置为NULL.
      
      说明:
      为指定的设备创建设备上下文。
      如果使用DEVMODE结构,就需要PRINT.H头文件。
      
      或者参数作如下说明:
      lpszDriverName是打印机所用的设备驱动程序。
      lpszDeviceName是进行打印的打印设备名称。设备驱动程序可以支持多种打印设备。
      lpszOutput:指定设备的串口名。
      lpInitData:是设备专用的初始化数据。
      使用打印机设备环境之后,必须调用DeleteDC()成员函数销毁它。但是,如果在堆栈
      中创建CDC类,程序返回时,设备环境自动删除。


      至此Windows提供的五个公共设备环境已经全部介绍完了。




    1.2.2 映射模式 
     /
     1.2.2 映射模式样
     vc++中采用的坐标映射方式使得用户图形坐标和输出设备的像素完全一致,当屏幕的像素大
     小为800*600时,每逻辑英寸包含的屏幕像素数为96,而打印机则需要多出
     好几倍的点数才能到达同样的逻辑尺寸。例如:HP打印机每逻辑英寸包含的打印机点数为600,
     也就是说打印机的清晰度比屏幕要高很多。这样的后果就是在屏幕上显示出来的满屏幕的图像
     在打印出来的纸上却只有一点点,怎么解决这个问题呢?一种简单的方法就是转换坐标映射方式,
     使得打印时采用的坐标比例比显示时采用的坐标比例相应地大若干倍.
     
     映射模式的意思是在屏幕或者打印机上绘图的时候,可以使用英寸或者毫米作为单位,这样更加直观.
     
     这其中要注意设备单位和逻辑单位的区别:逻辑单位是传递给绘图函数的x和y值,它们可以表示英寸和
     毫米,而设备单位是x和y在屏幕上的像素数,或是打印机上的点阵数。单击鼠标以设备单位返回。如果
     想知道鼠标单击位图的什么位置,需要将设备单位转化为逻辑单位。表1-5所示是可用的映射模式。
     
     映射模式        逻辑单位
     MM_TEXT         一个像素
     MM_LOMETRIC     0.1毫米
     MM_HIMETRIC     0.01毫米
     MM_LOENGLISH    0.01英寸
     MM_HIENGLISH    0.001英寸
     MM_TWIPS        1/1440英寸
     MM_ISOTROPIC    用户定义的值,但是x和y方向相等
     MM_ANISOTROPIC  用户定义的值,但是x和yy方向任意
     
     映射模式通过设备环境类的一个成员函数SetMapMode()来设置.只要把上述标志当作参数
     传入函数即可.设置映射模式后,传给任何绘图函数的坐标值都通过GDI内部的映射机制转
     换成设备坐标.如果把映射模式设置为MM_LOENGLISH,然后向绘图函数传递一个100的逻辑
     单位值,映射模式知道用户实际想要的是100*0.1mm,也就是1cm。
     
     映射模式MM_ISOTROPIC和MM_ANISOTROPIC允许改变比例因子和原点,使用这些模式改变窗
     口大小时,绘制的内容也会改变大小。
     
     使用MM_ISOTROPIC方式,x和y始终保持1:1的比例。如果在屏幕上画了一个圆,无论比例因
     子如何改变,始终还是圆,而在MM_ANISOTROPIC方式中,x和y比例因子可分别改变,圆会被
     压成椭圆。
     
     有一点需要注意:当使用MM_TEXT映射模式时候,y轴的正方向是沿屏幕垂直向下的,x轴是沿屏幕
     向右的.然而,其他的映射模式的y轴正方向是沿屏幕向上的,x轴正方向也是向右的.这一点特别容易
     搞混了.
     
     我们定义两个矩形,设置从逻辑环境到设备环境的转换。第一个矩形以逻辑单位表示绘制区域的大小,
     windows术语称之为窗口,第二个矩形以设备单位(即像素)表示第一个矩形大小代表的设备范围大小,
     在Windows术语中称之为视口,两种关系如图:
     1、设置视口到视图的客户区,并可忘记它。SetViewportOrg(0,0);SetViewPortExt(100,50);
     2、把窗口的初始位置设置在想在逻辑环境中看到的地方:SetWindowOrg(100,100);
     3、要缩小图形,只要缩小窗口的范围。要放大图形,只要增大窗口范围。要滚动图形,只要改变
     窗口的初始位置。
     
     SetWindowOrg()用来改变窗口坐标(逻辑坐标)的原点,SetViewPortOrg()用来改变视口坐标(设备坐标)
     的原点。
     void CPrintProjView::OnDraw(CDC *pDC)
     {
        pDC->SetMapMode(MM_TEXT);
        pDC->SetViewPortOrg(50,50);
        pDC->SetWindowPortOrg(200,200);
        CPen myPen(PS_SOLD,1,RGB(0,255,0));
        Cpen *pOldPen = pDC->SelectObject(&myPen);
        pDC->TextOut(200,200,_T("窗口映射模式"));
        pDC->Rectangle(200,200,400,400);
        pDC->SelectObject(pOldPen);
        myPen.DeleteObject();
     }
     这段代码,把视口原点设置为设置坐标(50,50),把窗口原点设置为逻辑坐标(200,200),
     然后通过窗口原点(200,200)绘制一个长宽各为200的方框.逻辑点(200,200)映射到设备
     点(50,50),即把窗口原点映射到视口原点.
     
     SetWindowExt()用来设定逻辑环境的大小,SetViewPortOrg()用来设定设备环境的大小.映射
     模式MM_ISOTROPIC和MM_ANISOTROPIC允许调用SetWindowExt()和SetViewPortExt()函数来设置
     设备坐标和逻辑坐标之间的比例.
     
     可以用下面的公式实现逻辑单位到设备单位的转换:
     x比例因子 = x视口长度/x窗口长度
     y比例因子 = y视口长度/y窗口长度
     设备x = 逻辑x * x比例因子 + x原点偏移量
     设备y = 逻辑y * y比例因子 + y原点偏移量
     设备环境本身提供了两个函数实现逻辑坐标和设备坐标之间的互换.DPtoLP()函数,可以
     接受一个指向CPoint类或者CRect类对象的指针作为参数,然后把它所指向的对象从设备
     坐标转换为逻辑坐标,LPtoDP的作用正好相反.
     
     下面这段程序根据GetClientRect()函数返回窗口客户矩形,函数SetWindowExt和SetViewportExt
     一起设置比例,结果窗口大小恰好是800*800,SetViewPortOrg函数把原点放置在窗口中心.这样椭
     圆恰好充满整个屏幕.
     
     void CPrintProjView::OnDraw(CDC *pDC)
     {
       CRect rcClient;
       GetClientRect(&rcClient);
       pDC->SetMapMode(MM_ANISOTROPIC);
       pDC->SetWindowExt(800,800);
       pDC->SetViewportExt(rcClient.right/2,rcClient.bottom/2);
       CPen myPen(PS_SOLID,1,RGB(255,0,0));
       CPen *pOldPen = pDC->SelectObject(&myPen);
       pDC->Ellipse(-400,-400,400,400);
       pDC->SelectObject(pOldPen);
       myPen.DeleteObject();
     }
     注意:SetWindowExt()和SetViewPortExt()函数只有在MM_ANISOTROPIC和MM_ISOTROPIC模式下才有效,
     在其他模式下,对它们的调用将被忽略。无论彩用哪种映射模式,GetClientRect()和GetWindowRect()
     函数返回的都是设备坐标(即像素)。




    1.2.3 MFC的打印功能分析
     
     1.框架中的打印
     MFC的框架内置了功能强大的打印和打印预览功能。首先,分析MFC应用程序框架打印的内在机制,
     这样将能更有效地使用打印机。
     
     在视图类及其派生类中,通过重载OnDraw(CDC*pDC)函数,利用它提供的pDC(设备上下文)指针,可以在
     屏幕上显示各种图形和数据。CView类的打印是通过OnPrint(CDC *pDC,CPrintInfo*pInfo)这个函数实现
     的,OnPrint()函数对打印的实现就是简单的调用OnDraw(CDC*pDC)这个函数,把打印机的设备上下文
     指针pDC传递给OnDraw(CDC *pDC)函数。可见CView类对输出到屏幕和输出到打印机的处理都是一样的,
     只是换了一个设备上下文而已(输出到屏幕时是通过OnPaint()函数实现的)。
     
     如果重载OnPrint()函数,可以选择根本不调用OnDraw来支持打印逻辑。OnPrint有两个参数,一个是指向
     打印机设备环境的指针,一个是打印信息对象CPrintInfo的指针,该信息包括纸张大小、当前页码和最大
     页码。对每个需要打印的页,应用程序框架都要调用一次OnPrint(),在OnPrintInfo结构中记录着当前页码。
     
     视图类及其派生类在进行显示和打印之前都会调用virtual void OnParepareDC(CDC *pDC,CPrintInfo* pInfo = null)
     这个虚成员函数来准备设备上下文,可以重载这个虚成员函数,进行坐标转换。下面是MFC框架打印的基本流程:
     
        OnPreparePrint---->设置起始和终止页  
           |
        OnBeginPrinting---->创建GDI对象
           |
        OnPrepareDC(每页)---->设置映射模式,并选择检测打印任务的结尾
           |
        OnPrint(每页)----->打印输出
           |
        是否打印完毕
           |
           y
        OnEndPrinting--->删除GDI对象
     
     CDC::GetDeviceCaps 获得指定设备的信息。
     int GetDeviceCaps(int nIndex)const;
     返回值:如果成功,则返回需要的能力值。
     LOGPIXELSX:沿显示宽度方向,每一逻辑单位的像素数。
     LOGPIXELSY:沿显示高度方向,每一逻辑单位的像素数。
     
     
     
     void CPrintProjView::OnDraw(CDC *pDC)
     {
       pDC->TextOut(400,200,_T("Hello word"));
     }
     
     BOOL CPrintProjView::OnPreparePrinting(CPrintInfo*pInfo)
     {
        pInfo->SetMaxPage(2);
        return DoPreparePrinting(pInfo);
     }
     
     void CPrintProjView::OnPrepareDC(CDC *pDC,CPrintInfo *pInfo)
     {
        CView::OnPrepareDC(pDC,pInfo);
        pDC->SetMapMode(MM_ANISOTROPIC); //转换坐标映射方式
        CSize size = CSize(800,560);
        pDC->SetWindowExt(size);//确定窗口的大小
        //得到实际设备每逻辑英寸的像素数量
        int xLogPixelPerInch = pDC->GetDeviceCaps(LOGPIXELSX);
        int yLogPixelPerInch = pDC->GetDeviceCaps(LOGPIXELSY);
        
        //得到设备坐标和逻辑坐标的比例
        long xExt = (long)size.cx * xLogPixelPerInch / 96;
        long yExt = (long)size.cy * yLogPixelPerInch / 96;
        pDC->SetViewportExt((int)xExt,(int)yExt); //设置视口大小
     }
     
     在上面的程序中,首先将坐标映射方式改变为MM_ANISOSTROPIC方式,即各向异性的意思,
     在这种坐标方式下,x轴和y轴的逻辑单位可以进行任意的缩放。改变坐标映射方式后,就要
     确定窗口大小和视口大小,注意窗口大小就是我们在屏幕上所见的尺寸,,而视口大小是实际
     设备,如打印机等,和显示设备每逻辑英寸的像素数量比较所得的比例尺.
     
     通过函数得到显示器和打印机每逻辑英寸的像素数量,然后对视口大小进行相应的缩放,就可以
     使屏幕上的显示和打印机的输出是一致了.
     
     编译、运行程序,使用打印预览功能,会看到在两个视图和预览两个页面中"Hello word"的位置是
     一样的。
     
     下次在看的时候,将这一部分再串一下。注意下面几点。
     1、只有在MM_ANISOTROPIC和MM_ISOTROPIC映射模式下,SetWindowExt和SetViewportExt才起作用。
        MM_ANISOTROPIC和MM_ISOTROPIC的区别是:
        MM_ANISOTROPIC是不锁定纵横比,也就是x和y各向异性,x和y轴的逻辑单位可以任意缩放。
        MM_ISOTROPIC:是锁定纵横比,x和y轴的比值是1:1
        
     2、SetWindowExt()设置窗口的x和y轴范围,也就是窗口的大小
        SetViewportExt()设置视口的x和y轴范围,也就是视口的大小
     
     3、窗口大小是指:我们在屏幕上所见的尺寸
        视口大小是指:实际设备,如打印机等.
        
    2、框架之外的打印
       框架实现了对打印的一些底层支持,直接的打印机制是通过函数StartDoc和EndDoc()来实现的。应用程序
       要使用打印机时,它首先使用CreateDC或PrintDlg来获取指向打印机设备环境的一个句柄,这就使得打印机
       设备驱动程序库模块被加载到内存(如果还没有加载到内存的话),并进行初始化。然后,程序调用StartDoc
       函数,通知一个新文档开始了。StartDoc函数是由GDI模块来处理的。GDI模块调用打印机设备驱动程序中的
       control函数告诉打印机准备打印。
       
       打印一个文档的过程以StartDoc调用开始,以EndDoc调用结束。调用StartPage来开始一页,调用EndPage来
       结束该页。
       
       下面这段代码在对话框中实现了对打印的支持。
       /*
       GetPrinterDC 获取设备环境的句柄。
       HDC GetPrinterDC()const;
       返回值:
       如果成功则返回一个打印机设备环境的句柄;否则返回null.
       说明:
       如果CPrintDialog构造函数的参数bPrintSetupOnly是FALSE(表明显示的是Print对话框,则GetPrinterDC返回一个
       打印机设备环境句柄。当你使用完这个设备环境时,你必须调用Windows DeleteDC函数来删除它。)
       */
       /*
       {
         long cbSize,
         CString lpszDocName,
         CString lpszOutput
       } DOCINFO;
       对文档进行定义的一个结构。
       cbSize:结构的大小
       lpszDocName:文档的名字
       lpszOutput:输出文档的名字
       */
       /*
       StartDoc:开始新的打印作业
       CDC::StartDoc
       int StartDoc(LPDOCINFO lpDocInfo);
       返回值:如果出错,例如存储空间不足或指定端口无效,则返回-1否则返回正值。
       参数:
       lpDocInfo: DOCINFO结构的指针。该结构包含了文档文件和输出文件的名字。
       
       说明:
       通知设备的驱动程序开始一个新的打印作业,其后所有的StartPage和EndPage调用处于假
       脱机状态,直到EndDoc调用出现。这确保了长于一页的文档不被其它作业中断。   
       */
       /*
       EndDoc  结束由StartDoc成员函数启动的打印作业。
       CDC::EndDoc
       int EndDoc();
       返回值:
       如果成功,则返回值大于零或等于零,出错则返回值小于零。下面列出了一般的错误
       类型:
       SP_ERROR:一般错误。
       SP_OUTOFDISK:假脱机所需的磁盘空间不足,没有其它可用的磁盘空间。
       SP_OUTOFMEMORY:假脱机所需的内存不足。
       SP_USERABORT: 用户在打印管理中中止作业。
       
       说明:
       中止由StartDoc成员函数调用的打印作业。在成功完成打印作业后应立即调用。
       如果应用遇到打印错误或取消的打印操作,决不可用EndDoc或AbortDoc去中止
       操作,GDI在返回错误值之前自动中止操作。   
       */
       /*
       StartPage:通知设备的驱动程序开始新页。
       CDC::StartPage
       int StartPage
       说明:
       调用该成员函数使用打印机驱动程序做好准备接收数据。在StartPage和EndPage之间,
       ResetDC成员函数不起作用。
       */
       /*
       EndPage:通知打印机驱动程序打印页结束。
       CDC::EndPage
       int EndPage()
       返回值:如果成功,则返回大于或等于零的值,如果失败则返回如下错误类型:
       SP_ERROR:一般错误
       SP_APPABORT: 作业终止
       SP_USERABORT:用户在打印管理中中止作业。
       SP_OUTOFDISK:假脱机所需的磁盘空间不足。
       SP_OUTOFMEMORY:假脱机所需的内存不足。
       
       说明:
       通知设备已经写完一页。该成员函数通常用在打印机驱动程序开始新的一页。
       */
       /*
       AbortDoc:终止当前打印任务,擦除自上次调用StartDoc成员函数以业写入设备的任何内容。
       CDC::AbortDoc
       int AbortDoc();
       返回值:如果成功,则返回大于或等于零的值,如果出现错误,则为负值。与EndPage和
       EndDoc返回的错误类型值一样。
       说明:
       终止当前打印任务,并擦除自上次StartDoc以后写入设备的任何任务。
       */
       
       /*
       CPrintInfo没有基类。
       CPrintInfo存储有关一次打印或打印预览的信息。每次选择Print或PrintPreview命令,框架
       就会创建一个CPrintInfo对象。并在命令完成时删除此对象。
       
       CPrintInfo包含打印时的一般信息,例如:要打印页的范围,打印机的状态,当前正在打印的页
       这些信息存放在CPintInfo的对象中;此对象还包括在CPrint对话框中输入的值。
       
       在打印期间,一个CPrintInfo对象在框架和视图类之间传递,并且用于两者之间交换信息。例如:
       框架通过对CPrintInfo类的m_nCurPgae成员赋值,来通知视图类要打印文档的哪一页,视图类检索
       此值,并执行指定页的实际打印。
       
       另一个例子就是文档的长度到打印的时候也不知道多少页。视图类每打印一页都要检测是否到了文档的
       末尾。当到达文档的末尾时,视图类将CPrintInfo的m_bContinuePrinting成员设置为FALSE,通知框架
       停止打印循环。
       */
       /*
       Attach:把Windows设备上下文句柄附加在CDC对象上。
       CDC::Attach
       BOOL Attach(HDC hDC);
       返回值:如果成功,返回非零值,否则为0
       参数:
       hDC:Windows设备上下文。
       说明:
       使用这个函数把hDC附加到CDC对象上。
       */
       /*
       Detach:从CDC对象中分离出Windows设备上下文。
       CDC::Detach
       HDC Detach()
       返回值:Windows设备上下文句柄。
       说明:
       调用该函数将m_hDC从CDC对象中分离出来。并将m_hDC与m_bAttribDC设备为NULL。
       */
       void CPrintProj::Print()
       {
        CDC dc;
        CPrintDialog printDlg(FALSE);
           //利用CPrintDialog生成打印机设备环境
        if(printDlg.DoModual() == IDCANCEL) //让用户选择打印纸张等
           return;
        dc.Attach(printDlg.GetPrinterDC());//让Handle连接到dc上.
        dc.m_bPrinting = TRUE;


        CString strTitle;
        strTitle.LoadString(AFX_IDS_APP_TITLE);


        DOCINFO di; //DOCINFO中有相关的打印信息
        ::ZeroMemory(&di,sizeof(DOCINFO));
        di.cbSize = sizeof(DOCINFO);
        di.lpszDocName = strTitle; //设置标题


        BOOL bPrintingOK = dc.StartDoc(&di); //开始打印


        CPrintInfo Info;
        Info.m_rectDraw.SetRect(0,0,dc.GetDeviceCaps(HORZRES),dc.GetDeviceCaps(VERTRES)); //设置范围.


           OnBeginPrinting(&dc,&Info); //调用你自定义的打印功能.
        fo(UINT page = Info.GetMinPage();page < Info.GetMaxPage() && bPrintOK;page++)
        {
         Info.m_nCurPage = page;
         OnPrint(&dc,&Info); //调用你的"Print page"函数
         bPrintOK = dc.EndPage() > 0; //结束页
        }
        OnEndPrinting(&dc,&Info);//结束打印.


        if(bPrintingOK)
         dc.EndDoc();
        else
         dc.AbortDoc();
        dc.Detach();
       }
       
       说明:其实在Windows环境中是设备无关的.只要有了DC,就可以使用各种GDI函数,而不需要理会是在屏幕或是在
       打印机上绘图.




    第2章      打印机基本控制技术


      打印编程之所以比较复杂,在于其需要处理的信息比较复杂.假如编程打印一张报表,我们不但要处理文本信息、
      完成表格绘制、版面编排等,而且可能还要进行相关图像处理。因此编写一个功能强大的打印程序,必须熟练
      掌握打印相关的控制技术。
    2。1 控制打印机
     2。1。1选择当前打印机
      一个系统可以连接多个打印机,甚至可以有其他程序(传真软件)将自已伪装成打印机.不论连接的打印机有多少,
      始终有一个"当前打印机"或者"默认打印机".


      获取默认打印机设备环境的标准方法有:EnumPrinters()函数.该函数填充一个包含每个所连接打印机信息的数组
      结构.根据需要,还可以选择几种结构作为该函数的参数. 如结构PRINTER_INFO_x,x是一个数字,在Windows95,98上
      函数使用PRINTER_INFO_5结构,在Windows2000/xp上,函数使用PRINTER_INFO_4结构.


      获取当前打印机的另一种方法是使用打印对话框CPrintDialog.该类的GetDeviceName()函数用以获得当前选择的打印
      机的名称,GetDriverName()函数用以获得当前选择的打印机驱动程序.


      /*
      EnumPrinters
      Declare function EnumPrinters lib (ByVal flags As long,ByVar name As String,
      Byval Level As long,pPrinterEnum As Byte,ByVal cdBuf As long,pcbNeeded As Long,pcReturned As long ) As Long


      说明:枚举系统中安装的打印机.


      返回值:
      long,非零表示成功,零表示失败.可以通过GetLastError获取错误值.


      参数:
      flags: long,一个或多个下述标志.
       PRINTER_ENUM_LOCAL:检举本地打印机(包括Window95中的网络打印机)
       PRINTER_ENUM_NAME:枚举由name参数指定的打印机.如果name为NULL,则枚举出可用的打印机.
       PRINTER_ENUM_SHARE:枚举出共享打印机(必须同其他常数组合使用)
       PRINTER_ENUM_CONNECTIONS:枚举网络列表中的打印机.(仅适用于NT)
       PRINTER_ENUM_NETWORK:枚举通过网络连接的打印机.级别(level)必须为1,仅适用于NT
      name:String,vbNullString表示枚举同本机连接的打印机.否则由标志和级别决定.
      Level:Long,1,2,4或5(4仅适用于NT,5仅适用于Win95和NT4.0)指定欲枚举的结构的类型.
      如果是1,则name参数由标志设置决定.如果是2或5,那么name就代表要枚举的打印服务器的名字.
      或者为vcbNullString.如果是4,那么只有PRINTER_ENUM_LOCAL和PRINTER_ENUM_CONNECTIONS才有效.名字必须是vbNullString.


      pPrinterEnum:Byte,包含PRINTER_ENUM_x结构的缓冲区,其中x代表级别.
      cbBuf:Long,pPrinterEnum缓冲区中的字符数量.
      pcbNeeded:Long,指向一个Long型变量的指针,该变量用于保存请求的缓冲区长度.或者实际读入的字节数量.
      pcReturned:Long,载入缓冲区的结构数量(用于那些能返回多个结构的函数).


      说明:
      第4级和第5级将它们的结构建立在系统注册表的基础上.而且要比第2级快得多.


      使用EnumPrinter时,要包含以下头文件:#include <winspool.h>
      */
      注意:使用Printing and Print Spooler 函数必须包含"winspool.h"头文件。
      注意:使用Windows NT/2000/xp的读者使用EnumPrinters()函数时请使用PRINTER_INFO_4结构。


      void CPrintProj::OnEnumPrinters()
      {
       DWORD dwSize,dwPtiner;
       ::EnumPrinters(PRINTER_ENUM_LOCAL,NULL,5,NULL,0,&dwSize,&dwPrinter);
       BYTE *pBuffer = new BYTE[dwSize];
       ::EnumPrinters(PRINTER_ENUM_LOCAL,NULL,5,pBuffer,dwSize,&dwSize,&dwPrinter);


       if(dwPrinter != 0)
       {
        PRINTER_INFO_5 *pPrnInfo = (PRINTER_INFO_5*)pBuffer;
        for(UINT i = 0; i < dwPrinter; i++)
        {
         CString strprnInfo = pPrnInfo->pPrinterName;
         AfxMessageBox(strprnInfo);
         pPrnInfo++;
        }
       }
       delete[] pBuffer;
      }




    2。1。2监测当前打印机状态
      Windows标准的打印机监测程序。通过该程序,我们可以了解当前打印机的状态,包括打印机任务队列,
      各项任务状态、所有者、进度和开始时间,并且可以及时暂停、清除打印任务。


      监控打印机就有必要对Windows后台打印机制有所了解。后台程序可以减轻应用程序的打印负担。Windows在启动时就加载后台
      打印程序。因此,当应用程序开始打印时,它已经是活动的了。当程序打印一个文件时,GDI模块创建打印的数据文件。后台
      打印程序的任务是将这些文件发往打印机。GDI模块发出一个消息来通知它开始一个新的打印作业。然后打印机开始读文件,
      并将文件传送到打印机。为了传送打印文件,后台程序为打印机所连接的并口和串口提供各种通信函数。在后台程序向打
      印机发送文件操作结束的命令后,它就删除包含输出数据的临时文件。


                   后台打印程序的组合。
      ----------------------------------------
      打印请求后台程序     | 将数据流传递给打印机
      本地打印提供者       | 为本地打印机创建后台文件
      网络打印提供者       | 为网络打印机创建后台文件。
      打印处理程序         | 将后台的设备无关数据转换为特定打印机的格式
      端口监视程序         | 控制连接打印机的端口
      语言监视程序         | 控制双向通信的打印机,配置并检测打印机的状态


      使用后台打印程序,真正的文件打印操作是后台打印程序的任务,而不是应用程序的任务。
      我们可以暂停打印作业、改变作业的优先级或者取消打印作业。这种管理方式使得应用程序
      可能比下面的这种情况“打印”得更快。即作业以实时方式打印,且必须等到打印完一页后
      才能处理下一页。


      但是如果我们拥有更好的打印机软硬件或者在网络打印机等某些特殊的情况下,可以去掉Windows后台打印程序。
      去掉Windows后以中打印程序可以加快打印速度。因为打印输出不必保存在硬盘上,而可以直接输出到打印机,并被
      外部硬件或软件后台程序所接受。


      实现类似Windows打印监测试程序的功能,需要调用Win32假脱机(SPOOL)枚举API函数。"[使用Win32假脱机枚举函数需要调用
      两次所需的函数。这些API函数通常要填充一组结构。但是,这些结构通常包含指向字符串和其他类型数据的指针。
      这些外来的数据必须存储在返回的内存中,使得字符串和其他数据存储在结构中。所以简单的在堆栈中声明一组结构变量
      不足以为API函数返回的信息设置足够的内存。]"


      因此,正确的函数调用是:首先调用API函数确定需要的内存空间,在随后的调用中传入一个指针,该指针指向了一块动态
      分配的大小合适内存空间。需要进行该类处理的枚举函数包括:
      EnumForms(),EnumJobs(),EnumMonitors(),EnumPorts(),EnumPrinterDrivers(),EnumPrinters()和EnumPrinterProcessors()


      下面这段程序,使用EnumJobs()API函数,枚举出所选打印机当前的打印任务。关于其他打印监控函数的使用大家可以参考
      微软平台SDK中关于打印函数和打印假脱机枚举函数的文档。


      注意:独占设备是指在一个程序(作业、用户)的整个运行其间独占的设备,直到该程序(作业、用户)完成。系统的独占设备是
      有限的(譬如一台计算机只能连接一台打印机),往往不能满足多进程的要求,会引起大量进程由于等待某些独占设备而阻塞,
      成为系统的“瓶颈”。另一方面,申请到独占设备的进程在其整个运行期间虽然占有设备,利用率却常常很低,设备还是经常
      处于空闲状态。为了解决这种矛盾,最常用的方法就是用共享设备来模拟独占设备,从而提高系统地效率和设备利用率.这种
      技术称为虚拟设备技术.实现这一技术的软、硬件系统被称为假脱机(Simultaneous Peripaheral Operation On Line SPOOL)
      系统。打印机是典型的独占设备。引入SPOOL技术后,用户的打印请求传递给SPOOL系统,而不是真正的把打印机分配给用户。
      SPOOL系统的输出进程是先磁盘上申请一个空闲区域,把需要打印的数据传输到里面,再把用户的打印请求挂到打印机队列上。
      如果打印机空闲,就会从打印机队列中取出一个打印请求,再从磁盘上的指定区域取出数据,执行打印操作。由于磁盘是共享
      的,SPOOL系统可以随时响应打印请求并把数据缓存起来,这样独占设备改造成了共享设备,从而提高了设备的利用率和系统
      利用率。


       /*
       OpenPrinter
       Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA"(ByVal pPrinterName As String,phPrinter As Long,
       pDefault As PRINTER_DEFAULTS)As Long


       说明:
       打开指定的打印机,并获取打印机的句柄。
       返回值:
       Long,非零表示成功,零表示失败。会设置GetLastError
       参数表:
       pPrinterName  String,要打开的打印机的名字
       phPrinter     Long,用于装载打印机的句柄。
       pDefault      PRINTER_DEFAULT,这个结构保存要载入的打印机信息。
       */
       /*
       Declare Function EnumJobs Lib "winspool.drv"Alias "EnumJobsA"(ByVal hPrinter As Long,
       ByVal First Job As Long,ByVal NoJobs As Long,ByVal Level As Long,pJob As Byte,ByVal cdBuf As Long
       ,pcbNeeded As Long,pcReturned As Long)As Long


       说明:
       枚举打印队列中的作业
       返回值:
       Long,非零表示成功,零表示失败。 可以通过GetLastError获取错误信息。
       hPrinter:  Long,一个已打开的打印机对象的句柄(用OpenPrinter获得)
       FirstJob:  Long,作业列表中要枚举的第一个作业的索引(注意编号从0开始)
       NoJobs     Long,要枚举的作业数量。
       Level      Long,1或2
       pJob       Byte,包含JOB_INFO_1或JOB_INFO_2结构的缓冲区
       cbBuf      Long,pJob缓冲区中的字符数量。
       pcbNeeded  Long,指向一个LONG型变量的指针,该变量用于保存请求的缓冲区长度
                  或者实际读入的字节数量。
       pcReturned Long,载入缓冲区的结构数量(用于那些能返回多个结构的函数)。
       */
       /*
       GetLastError
       Declare Function GetLastError lib "kernel32"Alias "GetLastError"As Long
       说明:
       针对之前调用的api函数,用这个函数取得扩展错误信息
       返回值:Long,由api函数决定.请参考api32.txt文件,其中列出了一系列错误常数;都以ERROR_前
       缀起头.常用的错误代码见下表:
       ERROR_INVALID_HANDLE:无效的句柄作为一个参数传递。
       ERROR_CALL_NOT_IMPLEMENTED  在win95下调用专为win nt设计的win32 api函数
       ERROR_INVALID_PARAMETER   函数中有个参数不正确。
       */
       /*
       EnumJobs
       Declare Function EnumJobs Lib "winspool.drv" alias "EnumJobsA"(ByVal hPrinter As Long,ByVal FirstJob As Long,ByVal NoJobs As Long,By Level As Long
       pJob As Byte,ByVal cdBuf As Long,pcbNeeded As Long,pcReturned As Long) As Long


       说明:
       枚举打印队列中的作业
       返回值:
       Long,非零表示成功,零表示失败。可以通过GetLastError获取错误信息
       参数表:
       hPrinter         Long,一个已打开的打印机对象的句柄(用OpenPrinter获得)
       FirstJob         Long,作业列表中要枚举的第一个作业的索引(注意编号从0开始)
       NoJobs           Long,要枚举的作业数量。
       Level            Long,1或2
       pJob             Byte,包含JOB_INFO_1或JOB_INFO_2结构的缓冲区。
       cbBuf            Long,pJob缓冲区中的字符数量。
       pcbNeeded        Long,指向一个Long型变量的指针,该变量用于保存请求的缓冲区长度,或者实际读入的字节数。
       pcbReturned      Long,载入缓冲区的结构数量。
       */


       BOOL CPrintListDlg::PrintJobList(LPCTSTR szPrintName)
       {
        HANDLE   hPrinter;
        DWORD    dwNeeded,dwReturned,i;
        JOB_INFO_1  *pJobInfo;


        if(!OpenPrinter(szPrinterName,&hPrinter,NULL))
         return FALSE;
        if(EnumJobs(hPrinter,0,0xFFFFFFFF,NULL,1,NULL,0,&dwNeeded,&dwReturned))
        {
         if(GetLastError() != ERROR_INSUFFICIENT_BUFFER)
         {
          ClosePrinter(hPrinter);
          return FALSE;
         }
        }
        if((pJobInfo = (JOB_INFO_1*)malloc(dwNeeded)) == NULL)
        {
         ClosePrinter(hPrinter);
         return FALSE;
        }
        if(!EnumJobs(hPrinter,0,0xFFFFFFFF,1,(LPBYTE)pJobInfo,dwNeeded,&dwNeeded,&dwReturned))
        {
         ClosePrinter(hPrinter);
         free(pJobInfo);
         return FALSE;
        }
        ClosePrinter(hPrinter);
        
        for(UINT i = 0; i < dwReturned; i++)
        {
         m_listBox2.AddString(pJobInfo[i].pDocument);
        }
        free(pJobInfo);
        return TRUE;
       }
       void CPrintListDlg::OnSelchangePrinters()
       {
        int nIndex = m_listBox.GetCurSel();
        CString strPrinterName;
        if(nIndex != CB_ERR)
        {
         m_listBox.GetText(nIndex,strPrinterName);
         if(strPrinterName.IsEmpty())
         {
          PrintJobList((LPCTSTRstrPrinterName));
         }
        }
       }
       /*
       这个例子启发我们,应用打印枚举API函数可以对打印机进行有效的监控。
       */

    展开全文
  • 打印机维修大全

    千次阅读 2005-02-06 14:07:00
    EPSON喷嘴技术揭秘 作为一种经济、有效的彩色打印输出设备,喷墨打印机已经被众多的用户所熟悉。尤其是随着数码影像技术的发展,自己制作数码照片的观念已渐渐被广大家庭用户所接受,以打印色彩见长喷墨打印机更有...
     
    

    EPSON喷嘴技术揭秘
     作为一种经济、有效的彩色打印输出设备,喷墨打印机已经被众多的用户所熟悉。尤其是随着数码影像技术的发展,自己制作数码照片的观念已渐渐被广大家庭用户所接受,以打印色彩见长喷墨打印机更有了施展本领的新天地。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

      是什么原因使得喷墨打印机可以输出精美亮丽的照片与图片呢?不同机型间打印品质的差别是怎么造成的呢?探讨这些问题,有必要从喷墨打印机的核心——喷嘴的技术讲起,从每个墨滴的形成过程谈起。

      首先要澄清一个问题:打印精度是不是喷墨打印机的基础技术指标。在喷墨打印机的发展过程中,打印精度一直是用户关注的一个技术指标,厂家在这方面也着力宣传。的确,从360dpi600dpi720dpi1200dpi1440dpi到现在最高的2880dpi,打印精度的不断提升带动着打印质量日益完美。但是,简单dpi数字不能说明打印品质的最根本问题。Dpi代表着每英寸内能够打印多少个墨点,如果我们不考虑墨点之间相互重合的问题,这个描述dpi的数字可以无限地提升,而打印质量却不会提高,甚至下降。因此,要有效提升dpi的数值,必须要有足够小的墨点为前提,即足够小的墨滴体积。只有在墨滴足够小的情况下,较高打印精度的实现才是真实的,才能够对提高最终打印品质发挥作用。

      另外,我们知道,喷墨打印机与显示设备、印刷设备类似,是通过对有限色素的组合排列来展现世间的万千色彩,而这种排列组合的方式不是随机的,是通过精密的计算得到的。既然是计算,肯定有一个假设前提,即所有墨点能够都按照一定的规则排列在纸面(或其他介质)上,并且每个墨点的形状基本上是一致的,可预见的。如果墨滴的着纸位置不能精确控制、或者形成的墨点太不规则、或者形成墨点时连带着在周围不可预见的位置喷溅上一些“卫星”墨滴(有些传统的热泡式喷墨打印机经常有这样的问题),那么高精确级别的计算只能是妄谈,在此基础上去实现更高的打印精度(dpi)并不能真正提高最终的打印质量。

      因此,减小墨滴体积、精确控制墨滴的着纸位置和墨点形状、减少墨滴的喷溅,便成为喷墨打印机厂商在提高打印质量方面着重要攻克的技术难题。在这方面,EPSON是最成功的厂商之一。

      EPSON采用与众不同的微压电喷嘴技术,通过电脉冲讯号控制压电器件,形成相应大小的对墨水的压力,使相应体积的墨滴从喷嘴喷出。与传统的热泡式喷嘴技术相比较,由于采用了更容易精确调整的电讯号进行控制,墨滴体积的控制更精确。目前,EPSON的很多机型最小墨滴体积都几经达到了4微微升,个别的机型更达到了创纪录的3微微升,据传其新型的2微微升墨滴的新产品也有可能于近期推出。正是这些业界领先的指标保证了EPSON产品可以实现真正的高精度打印。

       在墨滴控制方面,微压电方式还有一些先天的特殊优势。我们知道,由于墨滴极小,墨水喷嘴是非常细的,比头发丝还要细得多。在如此细微的局部内,喷嘴处墨水液面的表面张力便显得非常可观,一般墨滴形状不规则、墨滴喷溅等问题很大程度上都是这个液面张力在作怪。传统的热泡式喷嘴是通过对墨水的局部加热,产生气泡,气泡爆裂,使墨水从喷嘴喷出。这种方式在克服上述问题方面办法较少。而微压电方式由于是*压电芯片控制,可先将墨滴向后拉,再向外推射出去,就像离弦的箭一样,射出的墨点非常浑圆。这是热泡式喷嘴绝对无法实现的。依*推和拉两个方向的动作,微压电喷嘴可以实现独特的液面控制技术,最大限度地减小了液面张力对墨滴形状的影响,不会形成喷溅,同时还使得墨滴喷射方向稳定,墨点的着纸位置更精确。

      正是由于这些技术特点,使得EPSON微压电打印头打印的墨点排列有序、形状统一、并且没有多余的喷溅墨点,从而使最终的打印品色彩准确亮丽、层次细腻,表现力极强。

      当然,微压电式喷墨技术还有其他一些特点,比如能够精确实现智能墨滴变换功能等,这里不再详述。

      最后还要说明的是,很多人有一种误解:打印头的喷嘴数目越高,打印质量越高。其实,打印头的喷嘴数目与打印精度和打印质量无关,理论上即使只有一个喷嘴,也可以实现任意高的dpi值。增加喷嘴数目的目的只是为了提高打印速度。必须指出,影响打印速度的因素很多:不同的打印精度,当然会有不同的速度;不同类型的喷嘴喷射频率会有所差别;打印算法的差别;是否应用智能墨滴变换技术;走纸速度等等。总之,单纯的喷嘴数目不能说明任何问题。

     

    惠普打印机累积20载经验、找到彩色新出路

    “这是一个最好的年代,也是一个最坏的年代。”狄更斯在《双城记》中这样描述当时的年代。迄今为止,惠普打印机已经有20年的历史。20年来,打印机已经发展成非常成熟的IT产品,遍布在我们周围。那么,惠普眼中的打印机产品又是处在怎样的一个年代呢?
    近日,惠普召开了主题为“更胜一筹 脱颖而出 步步领先”的彩色商务策略发布会,宣布2004年彩色商务将步入主流,并宣布了一整套的彩色商务战略,旨在积极推动彩色商务在用户中的普及。惠普凭借在打印与成像创新领域20年的丰富经验和全球10亿美元的研发费用,以及在亚太地区6000万美元的投资,将竭力帮助用户突破以往重重阻碍因素,让缤纷色彩融入其业务的方方面面,使企业从彩色商务中轻松获益。
    20
    年孕育新策略
        20
    年的历程,对于一个人来讲,正值青年,旺盛的精神、充满活力的姿态是这个阶段的特点。对于惠普打印机来讲,亦是如此。惠普亚太地区及日本打印与成像集团高级副总裁Michael Hoffmann回顾说:1984年,惠普推出了单色台式激光打印机,迄今正好20年;1994年惠普彩色激光打印机首次亮相,迄今正好10年,发展至今,惠普在打印机领域创造了一个又一个奇迹。
    同时,20年的发展对于惠普打印机来讲,又是一个分水岭。用户对打印输出的需求发生着潜移默化的变化,从黑白转向彩色已经是不争的事实。为此,在这个时候,惠普推出了面向彩色商务的整体策略。
    整个策略包括三部分,对外,有与其他厂商的合纵连横;对内,有对自身资源的深度挖掘,以满足那些处于彩色商务不同层次消费者的需求。
    首先,惠普与AppleAdobe、微软和Quark等软件厂商携手合作,提供从办公领域到专业领域的软硬件彩色商务解决方案。
    其次,提供新的彩色打印解决方案。如惠普面向亚太地区市场推出首款价格低于500美元的彩色激光打印机Color LaserJet 2550L,面向中小企业用户。
    第三,也是最重要的一点,提高和改善打印质量。惠普将推出包括激光打印专用介质在内的新打印纸,无论是打印办公室常规文档,还是制作正规的市场营销材料,惠普都能提供专业的打印质量和可*性。
    Michael Hoffmann
    说:“惠普将为其所有客户带来更加全面的色彩体验。目前打印及成像设备的价格已经逐渐为用户所接受,而且技术本身也已经日趋成熟,能够满足客户在彩色商务方面的需求。”

    彩色普及障碍不再存在

    Michael Hoffmann用几个关键词来形容一直以来用户对彩色商务的误解:“太昂贵、太复杂、太庞大、太缓慢”。然而,目前的状态还是如此吗?

    据惠普估计,今天71亿美元的彩色商务打印市场,将以每年20%的比例增长,到2006年,全球市场规模将达到102亿美元。惠普亚太地区及日本打印与成像集团企业与大客户副总裁陈太丽说:“现在,用户对彩色商务的热情日益高涨。经济、方便易用、高图像质量和高性能,已经是在令人满意的彩色商务体验中必不可少的重要因素,惠普产品及其方案已经完全具备了这些因素。”
    惠普此次彩色商务战略策略的发布,使传统彩色商务概念的外延得以扩大:彩色商务用户分为四类——中小企业、大型企业、图形图像领域以及商业打印,所针对的用户是全方位的。办公室人员将不再困扰,因为使用惠普的打印解决方案不但快速、经济,而且方便易用;对营销和销售专业人士而言,惠普彩色打印解决方案则可以帮助他们自己制作营销材料,凭借更加美观的专业资料更快地响应客户;对于美术设计人员和出版人员,通过惠普的设备、技术和工作流程,将获得始终如一的色彩表现以及专业的图像质量;而市场人员也将从惠普的按需打印解决方案中获益匪浅,制作用于某一具体活动或短期使用的宣传材料,使为实现实时目标市场营销活动而定制、直邮成为可能。

    用户需求是核心
    面对如此复杂的用户类型,惠普何以逐一满足他们的需求呢?为此,Michael Hoffmann为记者形象地描述了一个等边三角形:三角形的中心是用户,三边分别由“高科技、高性价比、最佳客户体验”组成,这就是惠普面向个人及企业消费者推出产品和解决方案的宗旨。
    具体到不同的群体,惠普也制订了各自不同的策略。
    面向大中型企业,惠普推出了“Demand more”的口号,即惠普传递给企业用户的是更多的责任、更大的灵活性和更好的基于IT投资的回报。面向中小企业,惠普推出“Get more”的口号,即惠普提供的是更强的可*性、更多服务和支持、更加本地化和价格更具竞争力。中小企业对价格相对比较敏感,因此,除了向他们提供齐全的产品线以外,在推广中更加着重实用、稳定的高性价比产品,也是在中国进行彩色打印产品推广的特点之一。面向家庭消费者,惠普推出“Enjoy more”的口号,使消费者得到数码体验,感受到惠普的数码影像和数码娱乐的完全解决方案。
    惠普力求为满足用户的需求而实现创新,并针对不同用户提供不同的产品和解决方案。为了实现自己的战略目标,惠普还制订了特殊的策略和理念,争取以更有效的手段培育市场和推广产品,并最终促成彩色商务的全面普及。
    不败的等边三角形
    这是一个最好的年代,还是一个最坏的年代?对于惠普打印机来讲,我想已经找到了答案。
    当大家都在抱怨IT行业整体萎靡时,有没有看到像惠普打印机这样的企业和产品每年还在成倍地增长?当大家都在抱怨IT行业的利润已经微乎其微时,有没有感受到IT产品的极大普及和给消费者带来的便利和享受?当对于用户的需求感觉难以满足时,有没有意识到在用户需求的牵引下,整个IT行业每时每刻都发生着日新月异的变化,并且这种变化如此令人激动?
    中国人有句俗语叫“谋事在人,成事在天”,但后面紧跟着还有一句,就是“人定胜天”。如果能时时把握用户需求、顺应用户需要,无论是20年的惠普打印机,还是40年的惠普打印机,或是更长的年月,都将历久弥新,焕发出更诱人的色彩。
    整个采访过程,给我印象最深刻的就是那个“等边三角形”。我想,如果哪个企业把这个等边三角形执行得最彻底、最持久,定能时时刻刻立于不败之地。最好和最坏永远是相对的。
    惠普的合纵连横
    HP
    Adobe
    针对商务用户,惠普和Adobe正通力合作,在打印Adobe的作品时,一方面用AdobePDF文档解决方案为商业用户提供彩色体验,另一方面,用ICC标准帮助市场人员实现彩色输出。
    HP
    Apple
    惠普与Apple之间的合作已经有很长时间,以加强在彩色打印与成像领域对Mac平台的支持,并且为彩色打印与成像建立共同标准。惠普还提供支持Mac OS X ColorSync的解决方案,以及针对各个市场领域专业人士和消费者的支持。
    HP
    Microsoft
    惠普与微软将其各自的彩色商务专业知识相结合,为中小企业(SMB)提供内部打印解决方案。惠普的客户还将因为选购部分型号的打印机而得到附赠的商务工具包的光盘,帮助用户制作和打印营销文件。
    HP
    Quark
    在色彩管理和用户端解决方案领域,Quark HP正携手开展一系列彩色商务计划,包括对Quark应用软件在HP打印机上进行测试,全面支持包括CMYK Plus在内的惠普专业彩色打印技术。另外,惠普的Designjet系列打印机已成为市场上首批获得Quark公司认证的打印机。

    HP DesignJet5000/5500常见问题解答 ZT
    1.
    提问:HP DesignJet5000上纸和切纸时有时特别浪费,怎样操作可以省纸?
    解答:首先,在上纸前检查绘图仪面板里的TUR installed(收纸器)选项是否在 TUR installed =YES状态,因为选择yes,意味着启用收纸器,此时,纸张的前边不论整齐与否绘图仪都会认为你启用了收纸器而需要用纸张的前边来粘到收纸器的卷桶上,所以,所谓的上纸即裁纸就被取消了。另外,纸张上好以后,(绘图仪处于Ready状态)此时再将TUR installed(收纸器)选项设为TUR installed =NO状态,即关闭收纸器。将裁刀cutter(裁刀)选项设为cutter=on,即打开裁刀。此时绘图仪处于自动裁切状态,这样的自动裁纸比手动裁纸(Form feed&cut)要节省纸张。
    2.
    提问:HP DesignJet5000输出时纸张两侧的留白明显超过7mm,如何解决?
    解答:首先检查蒙泰软件里的纸张设定左右留边是否为零,如果是零,输出后仍然留边很大,再检查绘图仪面板里page format 菜单下的margins(边距)选项是否处于margins=normal(正常)状态。
    3.
    提问:HP DesignJet5000输出时总是镜像输出,输出前的设置里根本没有设置镜像,为什么?
    解答:如果输出前在photoshop和蒙泰里确实都没有做镜像,则检查绘图仪面板里page format 菜单下的mirroring(镜像)选项是否处于mirroring=off(关闭)状态。
    4.
    提问:HP DesignJet5000在图象打印完全以后继续向前走纸,如何解决?
    解答:首先检查一下在用蒙泰软件输出前的打印机设定里的自动设置纸张是否点击过,如果蒙泰里纸张设定没有问题的话,则检查绘图仪面板里page format 菜单下的size(尺寸)选项是否处于size=software(软件控制)状态。
    5.
    提问:怎样在HP DesignJet5000的前面板里查看绘图仪的IP地址
    解答:首先,将光标移到最上面的绘图仪选项,按ENTER(回车)键进入;选择I/O setup选项,按ENTER(回车)键进入;选择Card ID,按ENTER(回车)键进入即可查看。
    6.
    提问:怎样在HP DesignJet5000的前面板里查看绘图仪墨盒墨量的显示值?
    解答:首先,将光标移到面板上的墨盒选项,按ENTER(回车)键进入;选择相应的颜色,按ENTER(回车)键进入即可查看。
    7.
    提问:怎样在HP DesignJet5000的前面板里查看绘图仪墨头的使用情况?
    解答:首先,将光标移到面板上的墨头选项,按ENTER(回车)键进入;选择printhead info…选项,按ENTER(回车)键进入;选择相应的颜色,按ENTER(回车)键进入即可查看。
    8.
    提问:如何使用蒙泰打印管理系统?
    解答:首先,启动蒙泰打印管理系统(在windows主界面点击开始----程序----蒙泰电子出版系统----蒙泰打印管理系统),在管理菜单下选择 设定TCP/IP端口 ,再选择 添加端口 ,输入绘图仪的IP地址和端口名称,点击关闭;在 端口 里面选择刚刚确认的端口。 (以后在使用蒙泰输出时打印端口 选择此端口即可)。
    9.
    提问:怎样判断PC机的运算能力和HP DesignJet5000是否匹配?
    解答:在使用蒙泰输出时,屏幕的右下角有一个小打印机图标,单击此图标弹出蒙泰打印管理系统界面,此界面下有此时正在打印的作业的名称、状态、进度等数据的显示,注意观察进度的显示情况,如果斜线后面的数据始终大于斜线前面的数据,则说明PC机的运算能力可以满足HP DesignJet5000的输出要求。
    10.
    提问:怎样更改HP DesignJet5000在局域网上的IP地址、子网掩码、网关?
    解答:可以使用随机带的HP DesignJet5000程序安装盘,首先将HP DesignJet5000程序安装盘插入光驱,选择 仅创建网络端口 单击 下一步 ,选择 查找可用的打印机清单 单击 下一步 ,选择修改设置 即可,建议将IP地址修改为 169.254.170.50 ;子网掩码 255.255.0.0;网关169.254.170.50 ,单击 下一步 即可;如果安装了jetadmine 网管软件,可在软件主界面下直接更改。
    11.
    提问:怎样判断HP DesignJet5000是否和当前局域网连接?
    解答:可以进入DOS界面,键入C://ping 169.254.170.50(绘图仪IP地址)回车,如显示有数据被接收则表明网络处于连通状态,如显示requier time out 或没有数据被接收则表明网络不通;也可以在jetadmine 网管软件主界面下按F5键,如果可以看到有打印机存在,单击鼠标右键,选择属性,查看一下打印机是否处于联机状态。
    12.
    提问:HP DesignJet5000输出时,图象突然变的模糊不清(花图现象),怎样解决?
    解答:一般来讲使用网络打印功能不会出现数据错乱的情况,要注意使用的集线器要10/100M100M以保证网络的通畅。如使用蒙泰的打印管理系统,在输出时打印机设定菜单下的打印端口选项的后面有三个黑点,点击这三个小点,弹出端口使用设定菜单,将第一行和第三行前的对勾点掉。
    13.
    提问:HP DesignJet5000输出时,有时出现单向打印现象,怎么办?
    解答:这是蒙泰软件和HP DesignJet5000在输出时的结合问题,重新启动绘图仪即可。
    14.
    提问:HP DesignJet5000的耗墨量大约有多少?蒙泰里墨量的浓淡设定可以改变出墨量么?
    解答:HP DesignJet5000平均每平方米的耗墨量约10ml,蒙泰里墨量的浓淡设定可以改变绘图仪的出墨量。
    15.
    提问:HP DesignJet5000在打印目前市场上的背喷灯箱片时颜色不够鲜艳,如何解决?
    解答:使用最新的蒙泰安装盘,在文件菜单下选择打印机设定,选择安装蒙泰打印机,在打印机类型里选择自定义打印机,再选择安装新打印机,找到安装盘的目录下的HP5000DRV文件夹里的hpdj5kuv.pdshpdj5kx.pds文件,选择hpdj5kx.pds,确定,这样安装以后在蒙泰输出时的打印精度里面会有一项backfilm,选择此项,会加大绘图仪的出墨量。如果出墨量过大,在纸张类型里面可以选择CMYK90%CMYK85%等来降低以下墨量。
    16.
    提问:HP DesignJet5000在上纸时有时纸张的前边不整齐,绘图仪无法自动卷入纸张,怎样解决?
    解答:可以先将压杆压下,将纸张装入绘图仪对齐后放下压杆,再按 装入/取去介质 键,执行装纸步骤。
    17.
    提问:怎样改变HP DesignJet5000输出时墨头移动的PASS数?
    解答:改变纸张类型就可以改变PASS数,通常选择 Hewlett-Packard photo imaging gloss (高光像纸)即可,如果要提高打印速度,可以尝试选择HW coated paper coated paper来改变PASS,从而改变了绘图仪的打印速度(可在绘图仪面板里介质菜单下选择select media直接改变纸张类型,无须重新上纸)。
    18.
    提问:HP DesignJet5000打印时由于疏忽导致墨水盒里的墨水被打空了,管道里有明显的气泡,怎样解决?

    展开全文
  • 流: 1.输入时,程序从输入流中抽取字节,输出时,程序将字节插入到输出流中。...1.作用:更高效的处理输入输出,因为计算机对缓冲区的操作大大于对磁盘的操作。 2.比如,我们使用打印机打印文档,由于打...


    1.输入时,程序从输入流中抽取字节,输出时,程序将字节插入到输出流中。
    2.输入流可能来自键盘,也可能来自硬盘或者其他存储设备。同样,输入流中的字节可以流向屏幕,打印机,存储设备等等。
    3.c程序只检查字节流,而不需要知道字节流来自何方。
    4.缓冲区:又称缓存,是内存的一块空间
    作用:更高效的处理输入输出,因为计算机对缓冲区的操作大大快于对磁盘的操作。
    比如,我们使用打印机打印文档,由于打印机的打印速度相对较慢,我们先把文档输出到打印机相应的缓冲区,打印机再自行逐步打印,这时我们的CPU可以处理别的事情。

    fstream:

    1. close()函数关闭相关的文件流。
    2. 如果到达相关联的输入文件的末尾,eof()函数返回true,否则返回false。
    3. 如果当前流发生错误fail()函数返回true ,否则返回false 。

    写文件
    1)创建一个ofstream对象来管理输出流
    2)将该对象与文件关联起来
    3)使用cout方式使用该对象,唯一区别是输出将进入文件,而不是屏幕。
    4)关闭到文件的连接

    示例如下:

    ofstream fout;
    fout.open("test.txt");
    fout<<"write something";
    fout.close();
    

    创建对象和关联文件可使用构造函数合并到一步,以上代码等价于:

    ofstream fout("test.txt");
    fout<<"write something";
    fout.close();
    

    读文件
    1)创建一个ifstream对象来管理输入流
    2)将该对象与文件关联起来
    3)使用ifstream的方法读文件
    4)关闭到文件的连接
    示例如下:

    ifstream fin("test.txt");
    char ch;
    fin>>ch;	//从文件中读取一个字符
    char buf[80];
    fin>>buf;	//从文件中读取一个单词
    fin.getline(buf,80);	//从文件中读取一行
    string line;
    getline(fin,line);	//读取一行转换成字符串
    fin.close();
    
    
    exit();
    

    关闭所有文件,并结束程序;

    展开全文
  • 制作好的电子表格往往需要打印输出,以便信息的传递和分享。首先点击左上角的文件选项卡。 2. 然后点击左侧命令列表中的打印选项,进入打印操作页面。 3. 进入打印页面后,您可以设置各种打印参数。这里首先选择...
    1. 本节课将为您演示电子表格的打印功能。制作好的电子表格往往需要打印输出,以便信息的传递和分享。首先点击左上角的文件选项卡。 


    2. 然后点击左侧命令列表中的打印选项,进入打印操作页面。 


    3. 进入打印页面后,您可以设置各种打印参数。这里首先选择打印机设备。点击打印机下拉箭头,弹出打印机列表。 


    4. 在打印机列表中,选择一款与电脑相连的可以工作的打印机。 


    5. 接着点击打印机属性命令,打开打印机属性设置窗口。 


    6. 在布局面板中,您可以设置文件打印输出的方向 。点击方向下拉箭头,弹出纸张方向列表。 


    7. 选择列表中的纵向选项,设置打印的纸张方向为纵向打印。 


    8. 然后点击确定按钮,完成打印机的属性设置。 


    9. 在右侧的打印预览区中,文档的打印方向已经显示为设置好的纵向。继续点击打印机属性,再次打开打印机设置窗口。 


    10. 点击方向下拉箭头,弹出纸张方向列表。 


    11. 选择列表中的横向选项,设置打印的纸张方向为横向打印。 


    12. 点击确定按钮,完成打印机的属性设置。 


    13. 在右侧的打印预览区中,文档的打印方向已经显示为设置好的横向。继续点击打印机属性,再次打开打印机设置窗口。 


    14. 点击纸张/质量标签,显示纸张设置面板。 


    15. 点击纸张来源下拉箭头,可以选择打印机中的纸张来源。 


    16. 在弹出的列表中,选择打印纸张所在的位置。 


    17. 接着设置纸张的类型,点击媒体下拉箭头,弹出纸张类型列表。 


    18. 在纸张类型列表中,选择正确的纸张类型,以保证打印的效果。 


    19. 在颜色设置区,您可以设置打印输出的颜色类型,如果勾选黑白选项,则文档中的彩色内容将被打印为黑色或灰色。 


    20. 点击确定按钮,完成纸张的设置。 


    21. 点击右侧的垂直滚动条,查看底部的内容。 


    22. 从底部的内容可以得知,当前工作表将被打印在5张纸上。点击打印区域选项箭头,您可以自定义文档的打印区域。 


    23. 选择列表中的打印整个工作簿选项,可以打印输出整个工作簿中的所有工作表。 


    24. 整个工作簿中的内容将被打印在9张纸张上,点击下一页箭头,预览第二页输出的内容。 


    25. 在页码输入框内,点击输入需要查看的页码。 


    26. 然后按下键盘上的回车键,预览第9页的内容。 


    27. 点击上一页箭头,预览第8页输出的内容。 


    28. 在页码输入框内,点击输入1,返回第一页。 


    29. 按下键盘上的回车键,预览第1页的内容。 


    30. 点击右下角的显示比例图标,按100%的比例显示文档内容。 


    31. 此时可以观察文档的细节内容,点击右侧的垂直滚动条,查看下方的内容。 


    32. 点击底部的水平滚动条,查看文档右侧的内容。 


    33. 再次点击显示比例图标,恢复文档的显示比例。 


    34. 点击页边距调整图标,进入页边距调整界面。 


    35. 从预览区域可以得出,打印内容相对偏左,在左边距调整线上按下鼠标,并向右侧拖动,增加左边距的大小。 


    36. 除了调整边距的大小,您还可以调整单元格的宽度。 


    37. 再次点击调整边距图标,退出边距调整模式。 


    38. 接着为您演示,如何只打印工作表中,被选择的区域。点击左上角的后退图标,返回工作表界面。 


    39. 在预算性质单元格上按下鼠标,并向右下方拖动,选择工作表中的部分区域。 


    40. 再次点击文件选项卡,返回信息页面。 


    41. 点击左侧的打印命令,再次进入打印设置页面。 


    42. 点击打印区域下拉箭头,选择打印的工作表区域。 


    43. 选择列表中的打印选定区域选项,只打印刚刚您在工作表中,所选择的区域。 


    44. 从右侧的预览区可以得知,当前的打印范围为之前选择的区域。再次点击打印区域下拉箭头,弹出打印区域列表。 


    45. 选择列表中的打印活动工作表选项,只打印当前工作表中的内容。 


    46. 如果打印的页数比较多,您还可以设置打印的具体页数。点击页数设置双向箭头,设置打印起始页码。 


    47. 接着在打印结束页码输入框内,点击输入数字3,作为打印的结束页码。工作表中的第一至第三页,将被打印输出。 


    48. 您还可以设置打印的纸张顺序,点击下拉箭头,弹出打印顺序选项列表。 


    49. 选择列表中的取消排序选项。如果您设置了打印的份数为3,则第一页被打印3份后,才会打印第二页。 


    50. 点击纸张方向下拉箭头,弹出纸张方向列表。 


    51. 选择列表中的纵向选项,并观察右侧预览区域的变化。 


    52. 接着点击纸张规格下拉箭头,设置打印纸张的尺寸。 


    53. 选择列表中的16K选项,调整纸张的大小。 


    54. 点击边距设置下拉箭头,设置页面的打印边距。 


    55. 选择列表中的窄选项,将纸张四周的空白区域调整为最小。 


    56. 点击右侧的垂直滚动条,查看底部的打印设置选项。 


    57. 点击打印缩放下拉箭头,弹出打印缩放选项列表。 


    58. 选择[将工作表调整为一页]选项,每张工作表的内容,都将被缩小到一页纸张的大小。 


    59. 观察右侧打印预览区的变化。再次点击打印缩放下拉箭头,弹出打印缩放选项列表。 


    60. 选择列表中的[将所有列调整为一页]选项,可以将工作表内容缩小至一页纸的宽度,这是一种比较常用的选项。 


    61. 点击下一页箭头,查看第二页打印输出的内容。 


    62. 继续点击下一页箭头,查看第三页打印输出的内容,并结束本节课程。 



    本文整理自:《Excel 2016互动教程》,真正的[手把手]教学模式,用最快的速度上手Excel电子表格,苹果商店App Store免费下载:https://itunes.apple.com/cn/app/id1090726089,或扫描本页底部的二维码。课程配套素材下载地址:资料下载


    展开全文
  • 串口控制惠普打印机

    千次阅读 2018-11-15 13:35:42
    在项目开发中,经常要使用打印机,打印出检测的结果,在本项目中使用的是惠普打印机输出结果打印在A4纸上面。 本次使用U2P-016串口打印模块和惠普激光打印机P1106,编写了600行代码就搞定了,哈哈。先上图 程序...
  • 网络打印机挑选方法

    2012-07-09 08:41:54
    网络的广泛普及与应用促使网络打印机迅速走进办公用户的视野,学会使用网络打印机将成为一种必然和趋势.但由于网络打印机品牌很多,性能相差很大,而且价格也不一,因此我们必须根据使用的要求来选择网络打印机,不同品牌...
  • 3D打印机改装雕刻机经验分享

    万次阅读 多人点赞 2019-03-02 23:28:16
    /* 大概是大二的时候,为了参加学校的比赛,组装了一台无人机,只有外壳是自己用PRO/E设计的,然后用3D打印机打出来,其他的电子设备都是买的现成的,包括螺旋桨。无人机飞起来了,但是一轮面试都没有通过。虽然有些...
  • python 3d打印机by Nikolay Khabarov 通过尼古拉·哈巴罗夫(Nikolay Khabarov) 如何使用Python构建自己的CNC控制器和3D打印机 (How you can use Python to build your own CNC controller and 3D printer) This ...
  • C/C++之标准输入输出

    千次阅读 2017-03-10 18:02:39
    开销小,因为puts()只能输出字符串,不能输出数字或进行格式转换,因而puts()用的空间少且速度比printf()。因此函数puts()经常用于代码优化。操作失败时返回EOF,正常返回非负值。 int printf(const char* ...
  • EPSON ESC/POS打印机指令

    万次阅读 2018-02-24 13:50:59
    原文地址::... 相关文章 1、微型热敏打印机指令集----https://wenku.baidu.com/view/6de8b8fec281e53a5902ff98#1?qq-pf-to=pcqq.c2c 2、ESC pos指令集----http://jz.docin.com/p...
  • 打印机无法打印的一些解决办法

    千次阅读 2017-07-17 15:02:43
    应用广泛的打印机。其基本原理是带电的喷墨雾点经过电极偏转后,直接在纸上形成所需字形。其优点是组成字符和图像的印点比针式点阵打印机小得多,因而字符点的分辨率高,印字质量高且清晰。可灵活方便地改变字符...
  • 1、 C++的输入、输出分为基于控制台的输入/输出、基于文件的...C++还提供了无格式输入/输出和格式化输入/输出两种操作,无格式的传输速度快,格式化的按不同类型、不同格式对数据进行处理,不适合大容量的数据传输。
  • Java(2)-Java IO输入输出

    万次阅读 多人点赞 2012-04-01 11:28:55
    Java中I/O操作主要是指使用Java进行输入,输出操作.Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。任何Java中表示数据源的...
  • 打印机维修资料大全

    2009-03-15 16:37:00
    打印机维修资料大全 问:HP6L的机器纸进到2/3处就出现卡纸了,请问是不是要更换分页器?答:分页器主要是负责单页进纸的,其损坏主要会出现多张进纸的想象,和卡纸的关系不大,可以检查一下下搓纸轮,转印辊,他们...
  • Java直接控制打印机打印

    千次阅读 2017-04-27 18:36:08
    Windows 驱动的方法来实现后厨打印,那么肯定是不行的,因为我们只能单向向驱动程序抛包,不能从驱动程序获得任何返回值,没有办法了解是否打印成功,而且经过验证后发现,热敏打印机驱动打印时速度上非常慢。...
  • 新买的HP DeskJet 2131 喷墨一体打印机,按照... 在安装的打印机助手里面打印测试页可以正常输出,但是通过word里面的打印按钮则无法正常打印,虽然在打印列表里面可以看到打印任务但是大概经过3-5秒后任务自动取消。
  • 3D打印机DIY之六------G代码命令

    万次阅读 多人点赞 2019-12-14 10:59:42
    G代码是用于指导3D打印机怎么动作的文件,其实主要就是指导打印机的3轴电机和挤出机如何动作,比如某个电机正转多少、速度多少。 3D打印机本质就是gcode的执行器,同样的雕刻机、激光雕刻机也是。我们把一张平面...
  • 概述 可以通过打印机驱动程序或软件应用程序从...这是控制打印机方便途径,并将取代打印机控制面板的设置。参见软件相关的帮助文件,或者通过访问打印机驱动程序来获得更多信息。 也可以通过更改打印机控制...
  • C#控制DataMax打印机问题总结

    千次阅读 2014-12-11 00:27:16
    最近两周时间一直在测试系统涉及条码...我拿到打印机型号DataMax-I-4208热敏打印型号,坦白说解决问题过程是很折磨人的,一方面源自这方面官方提供资源和打印实例有限,另外一方面设计到设备参数具体调试, 针对C#控制Data
  • java回忆录—输入输出流详细讲解(入门经典)

    万次阅读 多人点赞 2016-08-07 02:39:37
    (不看后悔哦)一、什么是IOJava中I/O操作主要是指使用Java进行输入,输出操作。 Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法...
  • 1. 打印作业:打印软件产生打印动作的工作,这个打印作业会进入队列等待打印服务输出 2. 打印队列:放置打印作业的项目,通常以打印机的名字来命名 3. 打印服务:实际沟通队列内的打印作业与打印机的服务 一般说的...
  • 此外,与并行方式相比,串行方式能提供更快速的通信传输速度以及更简易的配置,SAS 的传输速率要比 SATA 得多。SAS 为服务器和网络存储等应用提供了更大的选择空间。 iSCSI iSCSI(Internet SCSI)是运行在 TCP/IP...
  • Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。 Java的I/O流提供了读写数据的标准方法。任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法。 ...
  • 之前公司有个面向商户的项目,需要连接商户打印机打印小票的功能。于是对这方面进行了学习研究,最后“顺利”的完成了项目需求。这里主要是对项目中用到的知识点进行一些总结。这篇文章主要包含的相关知识有:Socket...
  • 然而,opencl尚未应用到硬拷贝打印机和多功能打印机(mfp)市场。传统上,打印机/mfp市场使用全定制系统级芯片(soc或asic)、专用集成电路进行图像处理。在本文中,我们探讨了配合alterasoc fpga(现场可编程门阵列...
  • Caysn打印机IOS打印示例程序 - sample_20161008 接口说明文档下载地址: Caysn打印机IOS开发包接口说明文档 - PrinterLibs For IOS - 20161008 接口说明: 一 概述   1 NETPrinting、BLEPrinting处理...
  • 1.1--打印机编程 1.1 .1 打印机介绍 1.打印术语  cpi(characters Per Inch) 每英寸内所含的字符数,用来表示字符的大小、  间距。  cpl(Characters Per Line) 每行中所含的字符个数,用来在横向表示字符  ...
  • 提到打印机,全球第一大品牌惠普几乎无人不知无人不晓。就拿惠普今年10月份发布的新品打印机系列来说,自从面世以来就获得了不错的销量,用户好评也节节攀升,以HP LaserJet Pro MFP M132系列为代表的激光多功能一体...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,866
精华内容 6,346
关键字:

当前输出速度最快的打印机