zoukankan      html  css  js  c++  java
  • 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提供的五个公共设备环境已经全部介绍完了。

  • 相关阅读:
    laravel一对多
    laravel如何使用软删除
    java如何使用scanner
    java实现99乘法表
    git commit -am '本次提交描述'与 git commit -m '本次提交描述'
    django-pip安装
    pip切换阿里云镜像(国内镜像)
    [leetcode] Divide Two Integers
    [leetcode] Remove Duplicates from Sorted Array
    [leetcode] Remove Element
  • 原文地址:https://www.cnblogs.com/scud001/p/1704192.html
Copyright © 2011-2022 走看看