2 #include "BufferDC.h"
\r
4 IMPLEMENT_DYNAMIC(CBufferDC, CPaintDC)
\r
6 CBufferDC::CBufferDC(CWnd* pWnd) : CPaintDC(pWnd)
\r
8 if (pWnd != NULL && CPaintDC::m_hDC != NULL)
\r
10 m_hOutputDC = CPaintDC::m_hDC;
\r
11 m_hAttributeDC = CPaintDC::m_hAttribDC;
\r
13 pWnd->GetClientRect(&m_ClientRect);
\r
15 m_hMemoryDC = ::CreateCompatibleDC(m_hOutputDC);
\r
18 ::CreateCompatibleBitmap(
\r
20 m_ClientRect.right - m_ClientRect.left,
\r
21 m_ClientRect.bottom - m_ClientRect.top);
\r
23 m_hOldBitmap = (HBITMAP)::SelectObject(m_hMemoryDC, m_hPaintBitmap);
\r
25 CPaintDC::m_hDC = m_hMemoryDC;
\r
26 CPaintDC::m_hAttribDC = m_hMemoryDC;
\r
29 m_bBoundsUpdated = FALSE;
\r
32 CBufferDC::~CBufferDC(void)
\r
36 ::SelectObject(m_hMemoryDC, m_hOldBitmap);
\r
37 ::DeleteObject(m_hPaintBitmap);
\r
39 CPaintDC::m_hDC = m_hOutputDC;
\r
40 CPaintDC::m_hAttribDC = m_hAttributeDC;
\r
42 ::DeleteDC(m_hMemoryDC);
\r
45 void CBufferDC::Flush()
\r
49 m_ClientRect.left, m_ClientRect.top,
\r
50 m_ClientRect.right - m_ClientRect.left,
\r
51 m_ClientRect.bottom - m_ClientRect.top,
\r
57 UINT CBufferDC::SetBoundsRect( LPCRECT lpRectBounds, UINT flags )
\r
59 if (lpRectBounds != NULL)
\r
61 if (m_ClientRect.right - m_ClientRect.left > lpRectBounds->right - lpRectBounds->left ||
\r
62 m_ClientRect.bottom - m_ClientRect.top > lpRectBounds->bottom - lpRectBounds->top)
\r
64 lpRectBounds = &m_ClientRect;
\r
68 ::CreateCompatibleBitmap(
\r
70 lpRectBounds->right - lpRectBounds->left,
\r
71 lpRectBounds->bottom - lpRectBounds->top);
\r
73 HDC tmpDC = ::CreateCompatibleDC(m_hOutputDC);
\r
75 HBITMAP oldBmp = (HBITMAP)::SelectObject(tmpDC, bmp);
\r
79 m_ClientRect.left, m_ClientRect.top,
\r
80 m_ClientRect.right - m_ClientRect.left,
\r
81 m_ClientRect.bottom - m_ClientRect.top,
\r
86 ::SelectObject(tmpDC, oldBmp);
\r
89 HBITMAP old = (HBITMAP)::SelectObject(m_hMemoryDC, bmp);
\r
91 if (old != NULL && old != m_hPaintBitmap)
\r
93 ::DeleteObject(old);
\r
96 if (m_hPaintBitmap != NULL)
\r
98 ::DeleteObject(m_hPaintBitmap);
\r
101 m_hPaintBitmap = bmp;
\r
103 m_ClientRect = *lpRectBounds;
\r
104 m_bBoundsUpdated = TRUE;
\r
107 return CPaintDC::SetBoundsRect(lpRectBounds, flags);
\r
110 BOOL CBufferDC::RestoreDC( int nSavedDC )
\r
112 BOOL ret = CPaintDC::RestoreDC(nSavedDC);
\r
114 if (m_bBoundsUpdated)
\r
116 SelectObject(m_hPaintBitmap);
\r