123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- /*
- * Copyright (C) =USTC= Fu Li
- *
- * Author : Fu Li
- * Create : 2005-3-11
- * Home : www.crazy-bit.com
- * Mail : crazybit@263.net
- * History :
- */
- #pragma once
- /**
- * Memory DC class (to avoid screen's flash)
- */
- class FCMemDC : public CDC
- {
- public:
- /// Constructor
- FCMemDC (CDC* pDC, LPCRECT lpRect)
- {
- CreateCompatibleDC (pDC) ;
- m_rcDC = lpRect ; ASSERT(!m_rcDC.IsRectEmpty());
- m_memBmp.CreateCompatibleBitmap (pDC, m_rcDC.Width(), m_rcDC.Height()) ;
- m_pOldBitmap = SelectObject (&m_memBmp) ;
- m_pDC = pDC ; ASSERT(pDC);
- }
- virtual ~FCMemDC()
- {
- if (m_pOldBitmap)
- {
- ASSERT(FALSE) ;
- SelectObject (m_pOldBitmap) ;
- m_pOldBitmap = NULL;
- }
- }
- /// Draw content of memory DC to actual DC
- void FinalBlt()
- {
- m_pDC->BitBlt (m_rcDC.left, m_rcDC.top, m_rcDC.Width(), m_rcDC.Height(), this, 0, 0, SRCCOPY) ;
- m_pDC = NULL ;
- SelectObject (m_pOldBitmap) ;
- m_pOldBitmap = NULL ;
- }
- private:
- CBitmap m_memBmp ;
- CRect m_rcDC ;
- CBitmap * m_pOldBitmap ;
- CDC * m_pDC ;
- };
- /**
- * Auto restore DC's attribute (textcolor, bkmode, font, pen, brush)
- @verbatim
- example:
- FCAutoRestoreDCAttribute _dc_attri (pDC) ;
- CFont ft ;
- ft.CreatePointFont (90, _T("Arial")) ;
- ::SelectObject (pDC->GetSafeHdc(), ft.m_hObject) ;
- _dc_attri.Restore() ; // must restore before ft's deconstructor
- @endverbatim
- */
- class FCAutoRestoreDCAttribute
- {
- public:
- /// Save pDC's attributes when constructor
- FCAutoRestoreDCAttribute (CDC* pDC) : m_pDC(pDC), m_bHasRestore(FALSE)
- {
- m_crTxt = pDC->GetTextColor() ;
- m_nBkMode = pDC->GetBkMode() ;
- m_hFont = ::GetCurrentObject (pDC->GetSafeHdc(), OBJ_FONT) ; ASSERT(m_hFont);
- m_hPen = ::GetCurrentObject (pDC->GetSafeHdc(), OBJ_PEN) ; ASSERT(m_hPen);
- m_hBrush = ::GetCurrentObject (pDC->GetSafeHdc(), OBJ_BRUSH) ; ASSERT(m_hBrush);
- }
- /// Restore pDC's attributes if you haven't call Restore() method
- ~FCAutoRestoreDCAttribute()
- {
- Restore() ;
- }
- /// Restore pDC's attributes
- void Restore()
- {
- if (m_bHasRestore)
- return ;
- if (::GetCurrentObject (m_pDC->GetSafeHdc(), OBJ_FONT) != m_hFont)
- ::SelectObject (m_pDC->GetSafeHdc(), m_hFont) ;
- if (::GetCurrentObject (m_pDC->GetSafeHdc(), OBJ_PEN) != m_hPen)
- ::SelectObject (m_pDC->GetSafeHdc(), m_hPen) ;
- if (::GetCurrentObject (m_pDC->GetSafeHdc(), OBJ_BRUSH) != m_hBrush)
- ::SelectObject (m_pDC->GetSafeHdc(), m_hBrush) ;
- m_pDC->SetBkMode(m_nBkMode) ;
- m_pDC->SetTextColor(m_crTxt) ;
- m_bHasRestore = TRUE ;
- }
-
- private:
- CDC * m_pDC ;
- COLORREF m_crTxt ;
- int m_nBkMode ;
- HGDIOBJ m_hFont ;
- HGDIOBJ m_hPen ;
- HGDIOBJ m_hBrush ;
- BOOL m_bHasRestore ;
- };
|