MEMDC.H
上传用户:shgx688
上传日期:2009-12-27
资源大小:855k
文件大小:12k
源码类别:

SNMP编程

开发平台:

MultiPlatform

  1. #if !defined(AFX_MEMDC_H__CA1D3541_7235_11D1_ABBA_00A0243D1382__INCLUDED_)
  2. #define AFX_MEMDC_H__CA1D3541_7235_11D1_ABBA_00A0243D1382__INCLUDED_
  3. #if _MSC_VER >= 1000
  4. #pragma once
  5. #endif // _MSC_VER >= 1000
  6. // MemDC.h : header file
  7. //
  8. //////////////////////////////////////////////////
  9. // CMemDC - memory DC
  10. //
  11. // Author: Keith Rule
  12. // Email:  keithr@europa.com
  13. // Copyright 1996-1997, Keith Rule
  14. //
  15. // You may freely use or modify this code provided this
  16. // Copyright is included in all derived versions.
  17. //
  18. // History - 10/3/97 Fixed scrolling bug.
  19. //                   Added print support.
  20. //           25 feb 98 - fixed minor assertion bug
  21. //
  22. // This class implements a memory Device Context
  23. class CMemDCBase : public CDC
  24. {
  25. public:
  26. // constructor sets up the memory DC
  27. CMemDCBase(CDC* pDC) : CDC()
  28.     {
  29. // ASSERT(pDC != NULL);
  30. m_pDC = pDC;
  31. m_pOldBitmap = NULL;
  32.         m_bMemDC = !pDC->IsPrinting();
  33. }
  34. // Destructor copies the contents of the mem DC to the original DC
  35. ~CMemDCBase()
  36.     {
  37. if(m_bitmap.GetSafeHandle() != NULL)
  38. m_bitmap.DeleteObject();
  39. }
  40. // Allow usage as a pointer
  41.     CMemDCBase* operator->() {return this;}
  42.     // Allow usage as a pointer
  43.     operator CMemDCBase*() {return this;}
  44. private:
  45. protected:
  46. CBitmap  m_bitmap; // Offscreen bitmap
  47.     CBitmap* m_pOldBitmap; // bitmap originally found in CMemDC
  48.     CDC*     m_pDC; // Saves CDC passed in constructor
  49.     CRect    m_rect; // Rectangle of drawing area.
  50.     BOOL     m_bMemDC; // TRUE if CDC really is a Memory DC.
  51. };
  52. /*class CMemDC : public CMemDCBase
  53. {
  54. public:
  55. // constructor sets up the memory DC
  56. CMemDC(CDC* pDC) : CMemDCBase(pDC)
  57.     {
  58.         if (m_bMemDC) // Create a Memory DC
  59. {
  60.             pDC->GetClipBox(&m_rect);
  61.             CreateCompatibleDC(pDC);
  62.             m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
  63. m_pOldBitmap = SelectObject(&m_bitmap);
  64.             SetWindowOrg(m_rect.left, m_rect.top);
  65.         }
  66. else // Make a copy of the relevent parts of the current DC for printing
  67. {
  68.             m_bPrinting = pDC->m_bPrinting;
  69.             m_hDC = pDC->m_hDC;
  70.             m_hAttribDC = pDC->m_hAttribDC;
  71.         }
  72. }
  73. // Destructor copies the contents of the mem DC to the original DC
  74. ~CMemDC()
  75.     {
  76. if (m_bMemDC) {
  77. // Copy the offscreen bitmap onto the screen.
  78. m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
  79. this, m_rect.left, m_rect.top, SRCCOPY);
  80.             //Swap back the original bitmap.
  81.             SelectObject(m_pOldBitmap);
  82. } else {
  83. // All we need to do is replace the DC with an illegal value,
  84. // this keeps us from accidently deleting the handles associated with
  85. // the CDC that was passed to the constructor.
  86.             m_hDC = m_hAttribDC = NULL;
  87. }
  88. if(m_bitmap.GetSafeHandle() != NULL)
  89. m_bitmap.DeleteObject();
  90. DeleteDC();
  91. }
  92. // Allow usage as a pointer
  93.     CMemDC* operator->() {return this;}
  94.     // Allow usage as a pointer
  95.     operator CMemDC*() {return this;}
  96. private:
  97. protected:
  98. };
  99. */
  100. class CMemDC : public CDC
  101. {
  102. public:
  103.     // constructor sets up the memory DC
  104.     CMemDC(CDC* pDC) : CDC()
  105.     {
  106. //        ASSERT(pDC != NULL);
  107.         m_pDC = pDC;
  108.         m_pOldBitmap = NULL;
  109.         m_bMemDC = !pDC->IsPrinting();
  110.               
  111.         if (m_bMemDC)    // Create a Memory DC
  112.         {
  113.             pDC->GetClipBox(&m_rect);
  114.             CreateCompatibleDC(pDC);
  115.             m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
  116.             m_pOldBitmap = SelectObject(&m_bitmap);
  117.             SetWindowOrg(m_rect.left, m_rect.top);
  118.         }
  119.         else        // Make a copy of the relevent parts of the current DC for printing
  120.         {
  121.             m_bPrinting = pDC->m_bPrinting;
  122.             m_hDC       = pDC->m_hDC;
  123.             m_hAttribDC = pDC->m_hAttribDC;
  124.         }
  125.     }
  126.     
  127.     // Destructor copies the contents of the mem DC to the original DC
  128.     ~CMemDC()
  129.     {
  130.         if (m_bMemDC) 
  131.         {    
  132.             // Copy the offscreen bitmap onto the screen.
  133.             m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
  134.                           this, m_rect.left, m_rect.top, SRCCOPY);
  135.             //Swap back the original bitmap.
  136.             SelectObject(m_pOldBitmap);
  137.         } else {
  138.             // All we need to do is replace the DC with an illegal value,
  139.             // this keeps us from accidently deleting the handles associated with
  140.             // the CDC that was passed to the constructor.
  141.             m_hDC = m_hAttribDC = NULL;
  142.         }
  143.     }
  144.     // Allow usage as a pointer
  145.     CMemDC* operator->() {return this;}
  146.         
  147.     // Allow usage as a pointer
  148.     operator CMemDC*() {return this;}
  149. private:
  150.     CBitmap  m_bitmap;      // Offscreen bitmap
  151.     CBitmap* m_pOldBitmap;  // bitmap originally found in CMemDC
  152.     CDC*     m_pDC;         // Saves CDC passed in constructor
  153.     CRect    m_rect;        // Rectangle of drawing area.
  154.     BOOL     m_bMemDC;      // TRUE if CDC really is a Memory DC.
  155. };
  156. /*
  157. class CNCMemDC : public CDC
  158. {
  159. public:
  160. // constructor sets up the memory DC
  161. void Resize(CDC* pDC,RECT rcAll,RECT rc)
  162. {
  163. m_rect = rcAll;
  164. m_rc = rc;
  165. {
  166. if(m_bitmap.GetSafeHandle() != NULL)
  167. m_bitmap.DeleteObject();
  168.             m_bitmap.CreateCompatibleBitmap(pDC, rc.right-rc.left,rc.bottom-rc.top);
  169. if(m_pOldBitmap == NULL)
  170. m_pOldBitmap = SelectObject(&m_bitmap);
  171. else
  172. SelectObject(&m_bitmap);
  173.             SetWindowOrg(m_rc.left, m_rc.top);
  174.         }
  175. }
  176. void Redraw(CDC * pDC)
  177. {
  178. pDC->BitBlt(m_rc.left, m_rc.top, m_rc.Width(), m_rc.Height(),
  179. this, m_rc.left, m_rc.top, SRCCOPY);
  180. }
  181. CNCMemDC(CDC* pDC) : CDC()
  182.     {
  183. ASSERT(pDC != NULL);
  184. m_pDC = pDC;
  185. m_pOldBitmap = NULL;
  186. CreateCompatibleDC(pDC);
  187. }
  188. // Destructor copies the contents of the mem DC to the original DC
  189. ~CNCMemDC()
  190.     {
  191. if(m_bitmap.GetSafeHandle() != NULL)
  192. m_bitmap.DeleteObject();
  193. DeleteDC();
  194. }
  195. // Allow usage as a pointer
  196.     CNCMemDC* operator->() {return this;}
  197.     // Allow usage as a pointer
  198.     operator CNCMemDC*() {return this;}
  199. private:
  200. protected:
  201. CBitmap  m_bitmap; // Offscreen bitmap
  202.     CBitmap* m_pOldBitmap; // bitmap originally found in CMemDC
  203.     CDC*     m_pDC; // Saves CDC passed in constructor
  204.     CRect    m_rect; // Rectangle of drawing area.
  205.     CRect    m_rc;
  206. };
  207. */
  208. /////////////////////////////////////////////////////////////////////////////
  209. /*class CNCDraw
  210. {
  211. public:
  212. CNCMemDC m_dcTop;
  213. CNCMemDC m_dcLeft;
  214. CNCMemDC m_dcBottom;
  215. CNCMemDC m_dcRight;
  216. CNCDraw(CDC* pDC,RECT rcAll,RECT rc)
  217. :m_dcTop(pDC),m_dcLeft(pDC),m_dcBottom(pDC),m_dcRight(pDC)
  218. {
  219. Resize(pDC,rcAll,rc);
  220. }
  221. ~CNCDraw()
  222. {
  223. }
  224. void Resize(CDC* pDC,RECT rcAll,RECT rc)
  225. {
  226. m_rect = rcAll;
  227. m_rc = rc;
  228. {
  229. m_dcTop.Resize(pDC,rcAll,CRect(m_rect.left,m_rect.top,m_rect.right,m_rect.top+rc.top));
  230. m_dcLeft.Resize(pDC,rcAll,CRect(m_rect.left,m_rect.top+m_rc.top,m_rc.right,m_rect.bottom));
  231. m_dcBottom.Resize(pDC,rcAll,CRect(m_rect.left,m_rect.bottom-m_rc.bottom,m_rect.right+m_rc.right,m_rect.bottom));
  232. m_dcRight.Resize(pDC,rcAll,CRect(m_rect.right-m_rc.right,m_rect.top+m_rc.top,m_rect.right,m_rect.bottom));
  233.         }
  234. }
  235. void Redraw(CDC * pDC)
  236. {
  237. m_dcTop.Redraw(pDC);
  238. m_dcLeft.Redraw(pDC);
  239. m_dcBottom.Redraw(pDC);
  240. m_dcRight.Redraw(pDC);
  241. }
  242. protected:
  243.     CRect    m_rc; // Rectangle of drawing area.
  244.     CDC*     m_pDC; // Saves CDC passed in constructor
  245.     CRect    m_rect; // Rectangle of drawing area.
  246. };
  247. */
  248. class CMemDCEx : public CMemDCBase  
  249. {
  250. public:
  251. RECT m_rc;
  252. CMemDCEx(CDC* pDC,RECT rcAll,RECT rc):CMemDCBase(pDC)
  253. {
  254. // BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
  255. // m_pDC, m_rect.left, m_rect.top, SRCCOPY);
  256. m_rect = rcAll;
  257. m_rc = rc;
  258.         if (m_bMemDC) // Create a Memory DC
  259. {
  260. //            pDC->GetClipBox(&m_rect);
  261.             CreateCompatibleDC(pDC);
  262.             m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
  263. m_pOldBitmap = SelectObject(&m_bitmap);
  264.             SetWindowOrg(m_rect.left, m_rect.top);
  265.         }
  266. else // Make a copy of the relevent parts of the current DC for printing
  267. {
  268.             m_bPrinting = pDC->m_bPrinting;
  269.             m_hDC = pDC->m_hDC;
  270.             m_hAttribDC = pDC->m_hAttribDC;
  271.         }
  272. }
  273. virtual ~CMemDCEx()
  274. {
  275. if (m_bMemDC) {
  276. // Copy the offscreen bitmap onto the screen.
  277. m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rc.top,
  278. this, m_rect.left, m_rect.top, SRCCOPY);
  279. m_pDC->BitBlt(m_rect.left, m_rect.top, m_rc.left, m_rect.Height(),
  280. this, m_rect.left, m_rect.top, SRCCOPY);
  281. m_pDC->BitBlt(m_rect.left, m_rect.bottom-m_rc.bottom, m_rect.Width(), m_rc.bottom,
  282. this, m_rect.left, m_rect.bottom-m_rc.bottom, SRCCOPY);
  283. m_pDC->BitBlt(m_rect.right-m_rc.right, m_rect.top,m_rc.right , m_rect.bottom,
  284. this, m_rect.right-m_rc.right, m_rect.top, SRCCOPY);
  285.             //Swap back the original bitmap.
  286.             SelectObject(m_pOldBitmap);
  287. } else {
  288. // All we need to do is replace the DC with an illegal value,
  289. // this keeps us from accidently deleting the handles associated with
  290. // the CDC that was passed to the constructor.
  291.             m_hDC = m_hAttribDC = NULL;
  292. }
  293. if(m_bitmap.GetSafeHandle() != NULL)
  294. m_bitmap.DeleteObject();
  295. DeleteDC();
  296. }
  297. };
  298. class CStretchDC : public CDC  
  299. {
  300. public:
  301. CRect m_rc;
  302. CStretchDC(CDC* pDC,RECT rc,RECT rcEx):CDC()
  303. {
  304. m_rc = rc;
  305. // ASSERT(pDC != NULL);
  306. m_pDC = pDC;
  307. m_pOldBitmap = NULL;
  308.         m_bMemDC = !pDC->IsPrinting();
  309.         if (m_bMemDC) // Create a Memory DC
  310. {
  311. //            pDC->GetClipBox(&m_rect);
  312. m_rect = rcEx;
  313.             CreateCompatibleDC(pDC);
  314.             m_bitmap.CreateCompatibleBitmap(pDC, m_rc.Width(), m_rc.Height());
  315. m_pOldBitmap = SelectObject(&m_bitmap);
  316.             SetWindowOrg(m_rc.left, m_rc.top);
  317.         }
  318. else // Make a copy of the relevent parts of the current DC for printing
  319. {
  320.             m_bPrinting = pDC->m_bPrinting;
  321.             m_hDC = pDC->m_hDC;
  322.             m_hAttribDC = pDC->m_hAttribDC;
  323.         }
  324. }
  325. virtual ~CStretchDC()
  326. {
  327. if (m_bMemDC) {
  328. // Copy the offscreen bitmap onto the screen.
  329. m_pDC->StretchBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
  330. this, m_rc.left, m_rc.top,m_rc.Width(),m_rc.Height(), SRCCOPY);
  331.             //Swap back the original bitmap.
  332.             SelectObject(m_pOldBitmap);
  333. } else {
  334. // All we need to do is replace the DC with an illegal value,
  335. // this keeps us from accidently deleting the handles associated with
  336. // the CDC that was passed to the constructor.
  337.             m_hDC = m_hAttribDC = NULL;
  338. }
  339. if(m_bitmap.GetSafeHandle() != NULL)
  340. m_bitmap.DeleteObject();
  341. }
  342. protected:
  343. CBitmap  m_bitmap; // Offscreen bitmap
  344.     CBitmap* m_pOldBitmap; // bitmap originally found in CMemDC
  345.     CDC*     m_pDC; // Saves CDC passed in constructor
  346.     CRect    m_rect; // Rectangle of drawing area.
  347.     BOOL     m_bMemDC; // TRUE if CDC really is a Memory DC.
  348. };
  349. class CLLXMemDC : public CDC {
  350. private:
  351. CBitmap* m_bitmap;
  352. CBitmap* m_oldBitmap;
  353. CDC* m_pDC;
  354. CRect m_rcBounds;
  355. public:
  356. CLLXMemDC(CDC* pDC, const CRect& rcBounds) : CDC()
  357. {
  358. CreateCompatibleDC(pDC);
  359. m_bitmap = new CBitmap;
  360. m_bitmap->CreateCompatibleBitmap(pDC, rcBounds.Width(), rcBounds.Height());
  361. m_oldBitmap = SelectObject(m_bitmap);
  362. m_pDC = pDC;
  363. m_rcBounds = rcBounds;
  364. }
  365. ~CLLXMemDC() 
  366. {
  367. m_pDC->BitBlt(m_rcBounds.left, m_rcBounds.top, m_rcBounds.Width(), m_rcBounds.Height(), 
  368. this, 0/*m_rcBounds.left, m_rcBounds.top*/,0, SRCCOPY);
  369. SelectObject(m_oldBitmap);
  370. if (m_bitmap != NULL) delete m_bitmap;
  371. }
  372. CLLXMemDC* operator->() {
  373. return this;
  374. }
  375. };
  376. //{{AFX_INSERT_LOCATION}}
  377. // Microsoft Developer Studio will insert additional declarations immediately before the previous line.
  378. #endif // !defined(AFX_MEMDC_H__CA1D3541_7235_11D1_ABBA_00A0243D1382__INCLUDED_)