zoukankan      html  css  js  c++  java
  • 一个很有用的内存DC类

    #ifndef _MEMDC_H_
    #define _MEMDC_H_

    //////////////////////////////////////////////////
    // CMemDC - memory DC
    //
    // Author: Keith Rule
    // Email:  keithr@europa.com
    // Copyright 1996-2002, Keith Rule
    //
    // You may freely use or modify this code provided this
    // Copyright is included in all derived versions.
    //
    // History - 10/3/97 Fixed scrolling bug.
    //                   Added print support. - KR
    //
    //           11/3/99 Fixed most common complaint. Added
    //                   background color fill. - KR
    //
    //           11/3/99 Added support for mapping modes other than
    //                   MM_TEXT as suggested by Lee Sang Hun. - KR
    //
    //           02/11/02 Added support for CScrollView as supplied
    //                    by Gary Kirkham. - KR
    //
    // This class implements a memory Device Context which allows
    // flicker free drawing.

    class CMemDC : public CDC {
    private: 
     CBitmap  m_bitmap;  // Offscreen bitmap
     CBitmap* m_oldBitmap; // bitmap originally found in CMemDC
     CDC*  m_pDC;   // Saves CDC passed in constructor
     CRect  m_rect;   // Rectangle of drawing area.
     BOOL  m_bMemDC;  // TRUE if CDC really is a Memory DC.
    public:
     
     CMemDC(CDC* pDC, const CRect* pRect = NULL) : CDC()
     {
      ASSERT(pDC != NULL);

      // Some initialization
      m_pDC = pDC;
      m_oldBitmap = NULL;
      m_bMemDC = !pDC->IsPrinting();

      // Get the rectangle to draw
      if (pRect == NULL) {
       pDC->GetClipBox(&m_rect);
      } else {
       m_rect = *pRect;
      }

      if (m_bMemDC) {
       // Create a Memory DC
       CreateCompatibleDC(pDC);
       pDC->LPtoDP(&m_rect);

       m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
       m_oldBitmap = SelectObject(&m_bitmap);

       SetMapMode(pDC->GetMapMode());

       SetWindowExt(pDC->GetWindowExt());
       SetViewportExt(pDC->GetViewportExt());

       pDC->DPtoLP(&m_rect);
       SetWindowOrg(m_rect.left, m_rect.top);
      } else {
       // Make a copy of the relevent parts of the current DC for printing
       m_bPrinting = pDC->m_bPrinting;
       m_hDC       = pDC->m_hDC;
       m_hAttribDC = pDC->m_hAttribDC;
      }

      // Fill background
      FillSolidRect(m_rect, pDC->GetBkColor());
     }
     
     ~CMemDC() 
     {  
      if (m_bMemDC) {
       // Copy the offscreen bitmap onto the screen.
       m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
        this, m_rect.left, m_rect.top, SRCCOPY);   
       
       //Swap back the original bitmap.
       SelectObject(m_oldBitmap);  
      } else {
       // All we need to do is replace the DC with an illegal value,
       // this keeps us from accidently deleting the handles associated with
       // the CDC that was passed to the constructor.   
       m_hDC = m_hAttribDC = NULL;
      } 
     }
     
     // Allow usage as a pointer 
     CMemDC* operator->()
     {
      return this;
     } 

     // Allow usage as a pointer 
     operator CMemDC*()
     {
      return this;
     }
    };

    #endif

  • 相关阅读:
    基本技能训练之线程
    关于UEditor的使用配置(图片上传配置)
    PAT 乙级练习题1002. 写出这个数 (20)
    codeforces 682C Alyona and the Tree DFS
    codeforces 681D Gifts by the List dfs+构造
    codeforces 678E Another Sith Tournament 概率dp
    codeforces 680E Bear and Square Grid 巧妙暴力
    codeforces 678D Iterated Linear Function 矩阵快速幂
    codeforces 679A Bear and Prime 100 交互
    XTUOJ 1248 TC or CF 搜索
  • 原文地址:https://www.cnblogs.com/s5689412/p/182465.html
Copyright © 2011-2022 走看看