00001 #ifndef _MEMDC_H_
00002 #define _MEMDC_H_
00003
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00031 class CMemDC : public CDC {
00032 private:
00033 CBitmap m_bitmap;
00034 CBitmap* m_oldBitmap;
00035 CDC* m_pDC;
00036 CRect m_rect;
00037 BOOL m_bMemDC;
00038 public:
00039
00040 CMemDC(CDC* pDC, const CRect* pRect = NULL) : CDC()
00041 {
00042 ASSERT(pDC != NULL);
00043
00044
00045 m_pDC = pDC;
00046 m_oldBitmap = NULL;
00047 m_bMemDC = !pDC->IsPrinting();
00048
00049
00050 if (pRect == NULL) {
00051 pDC->GetClipBox(&m_rect);
00052 } else {
00053 m_rect = *pRect;
00054 }
00055
00056 if (m_bMemDC) {
00057
00058 CreateCompatibleDC(pDC);
00059 pDC->LPtoDP(&m_rect);
00060
00061 m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
00062 m_oldBitmap = SelectObject(&m_bitmap);
00063
00064 SetMapMode(pDC->GetMapMode());
00065
00066 SetWindowExt(pDC->GetWindowExt());
00067 SetViewportExt(pDC->GetViewportExt());
00068
00069 pDC->DPtoLP(&m_rect);
00070 SetWindowOrg(m_rect.left, m_rect.top);
00071 } else {
00072
00073 m_bPrinting = pDC->m_bPrinting;
00074 m_hDC = pDC->m_hDC;
00075 m_hAttribDC = pDC->m_hAttribDC;
00076 }
00077
00078
00079 FillSolidRect(m_rect, pDC->GetBkColor());
00080 }
00081
00082 ~CMemDC()
00083 {
00084 if (m_bMemDC) {
00085
00086 m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
00087 this, m_rect.left, m_rect.top, SRCCOPY);
00088
00089
00090 SelectObject(m_oldBitmap);
00091 } else {
00092
00093
00094
00095 m_hDC = m_hAttribDC = NULL;
00096 }
00097 }
00098
00099
00100 CMemDC* operator->()
00101 {
00102 return this;
00103 }
00104
00105
00106 operator CMemDC*()
00107 {
00108 return this;
00109 }
00110 };
00111
00112 #endif