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提供的五个公共设备环境已经全部介绍完了。

  • 相关阅读:
    HDU 5835 Danganronpa 贪心
    HDU 5842 Lweb and String 水题
    HDU 5832 A water problem 水题
    Codeforces Beta Round #14 (Div. 2) A. Letter 水题
    Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem K. UTF-8 Decoder 模拟题
    Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem I. Alien Rectangles 数学
    Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem H. Parallel Worlds 计算几何
    Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem F. Turning Grille 暴力
    Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem C. Cargo Transportation 暴力
    Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem G. k-palindrome dp
  • 原文地址:https://www.cnblogs.com/scud001/p/1704192.html
Copyright © 2011-2022 走看看