﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Neil210</title><link>http://www.cppblog.com/Neil210/</link><description /><language>zh-cn</language><lastBuildDate>Fri, 17 Apr 2026 02:05:10 GMT</lastBuildDate><pubDate>Fri, 17 Apr 2026 02:05:10 GMT</pubDate><ttl>60</ttl><item><title>利用CMemDC画图的两种方法</title><link>http://www.cppblog.com/Neil210/archive/2012/08/02/186063.html</link><dc:creator>教主</dc:creator><author>教主</author><pubDate>Thu, 02 Aug 2012 12:06:00 GMT</pubDate><guid>http://www.cppblog.com/Neil210/archive/2012/08/02/186063.html</guid><wfw:comment>http://www.cppblog.com/Neil210/comments/186063.html</wfw:comment><comments>http://www.cppblog.com/Neil210/archive/2012/08/02/186063.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Neil210/comments/commentRss/186063.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Neil210/services/trackbacks/186063.html</trackback:ping><description><![CDATA[<p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><strong><span style="font-family: mceinline; ">方法一： 在VS 2010中有一个类CMemDC，&nbsp;在MFC下可解决绘图闪烁。</span></strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">看看MSDN钟怎么说的：<br /></p><p><strong>CMemDC Class<br /></strong><em><strong>A helper class for a memory device context. The memory device context supports offscreen drawing.<br /></strong></em><strong>在库中的声明如下<br /></strong><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><img id="Code_Closed_Image_200007" onclick="this.style.display='none'; Code_Closed_Text_200007.style.display='none'; Code_Open_Image_200007.style.display='inline'; Code_Open_Text_200007.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_200007" style="display: none" onclick="this.style.display='none'; Code_Open_Text_200007.style.display='none'; Code_Closed_Image_200007.style.display='inline'; Code_Closed_Text_200007.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span id="Code_Closed_Text_200007" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"></span><span id="Code_Open_Text_200007" style="display: none"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;CMemDC<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">public</span>:<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;AFX_IMPORT_DATA&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;BOOL&nbsp;m_bUseMemoryDC;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;CMemDC(CDC&amp;&nbsp;dc,&nbsp;CWnd*&nbsp;pWnd);<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;CMemDC(CDC&amp;&nbsp;dc,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;CRect&amp;&nbsp;rect);<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;~CMemDC();<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;CDC&amp;&nbsp;GetDC()&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;m_bMemDC&nbsp;?&nbsp;m_dcMem&nbsp;:&nbsp;m_dc;&nbsp;}<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;BOOL&nbsp;IsMemDC()&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;m_bMemDC;&nbsp;}<br /><span style="color: #008080; ">10</span>&nbsp;BOOL&nbsp;IsVistaDC()&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;m_hBufferedPaint&nbsp;!=&nbsp;NULL;&nbsp;}<br /><span style="color: #008080; ">11</span>&nbsp;<span style="color: #0000FF; ">protected</span>:<br /><span style="color: #008080; ">12</span>&nbsp;CDC&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_dc;<br /><span style="color: #008080; ">13</span>&nbsp;BOOL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_bMemDC;<br /><span style="color: #008080; ">14</span>&nbsp;HANDLE&nbsp;&nbsp;&nbsp;m_hBufferedPaint;<br /><span style="color: #008080; ">15</span>&nbsp;CDC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_dcMem;<br /><span style="color: #008080; ">16</span>&nbsp;CBitmap&nbsp;&nbsp;m_bmp;<br /><span style="color: #008080; ">17</span>&nbsp;CBitmap*&nbsp;m_pOldBmp;<br /><span style="color: #008080; ">18</span>&nbsp;CRect&nbsp;&nbsp;&nbsp;&nbsp;m_rect;<br /><span style="color: #008080; ">19</span>&nbsp;</span></div><strong style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">使用方法:</strong>&nbsp;<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><img id="Code_Closed_Image_200104" onclick="this.style.display='none'; Code_Closed_Text_200104.style.display='none'; Code_Open_Image_200104.style.display='inline'; Code_Open_Text_200104.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_200104" style="display: none" onclick="this.style.display='none'; Code_Open_Text_200104.style.display='none'; Code_Closed_Image_200104.style.display='inline'; Code_Closed_Text_200104.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span id="Code_Closed_Text_200104" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">// 1、响应WM_ERASEBKGND消息，返回FALSE，这样就不擦除背景了。&nbsp;</span><span id="Code_Open_Text_200104" style="display: none"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;BOOL&nbsp;CDemoView::OnEraseBkgnd(CDC*&nbsp;pDC)&nbsp;&nbsp;<br /><span style="color: #008080; ">2</span>&nbsp;{&nbsp;<br /><span style="color: #008080; ">3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;FALSE;&nbsp;<br /><span style="color: #008080; ">4</span>&nbsp;</span></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><img id="Code_Closed_Image_200144" onclick="this.style.display='none'; Code_Closed_Text_200144.style.display='none'; Code_Open_Image_200144.style.display='inline'; Code_Open_Text_200144.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_200144" style="display: none" onclick="this.style.display='none'; Code_Open_Text_200144.style.display='none'; Code_Closed_Image_200144.style.display='inline'; Code_Closed_Text_200144.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span id="Code_Closed_Text_200144" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">// 2、在需要作图的地方使用CMemDC。</span><span id="Code_Open_Text_200144" style="display: none"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;&nbsp;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;CDemoView::OnDraw(CDC*&nbsp;pDC)<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;CGestureDemoDoc*&nbsp;pDoc&nbsp;=&nbsp;GetDocument();<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;ASSERT_VALID(pDoc);<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;CMemDC&nbsp;dcMem(*pDC,&nbsp;<span style="color: #0000FF; ">this</span>);<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;CDC&amp;&nbsp;dc&nbsp;=&nbsp;dcMem.GetDC();<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">do&nbsp;anything&nbsp;with&nbsp;graphic&nbsp;object&nbsp;dc;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; "></span><br /><span style="color: #008080; ">10</span>&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /><br /><span style="color: #008080; ">11</span>&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;</span></div></p><strong style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><span style="font-family: mceinline; ">二： 网上有另外一种利用CMemDC继承CDC的方式如下：</span></strong>&nbsp;<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><img id="Code_Closed_Image_200504" onclick="this.style.display='none'; Code_Closed_Text_200504.style.display='none'; Code_Open_Image_200504.style.display='inline'; Code_Open_Text_200504.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_200504" style="display: none" onclick="this.style.display='none'; Code_Open_Text_200504.style.display='none'; Code_Closed_Image_200504.style.display='inline'; Code_Closed_Text_200504.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span id="Code_Closed_Text_200504" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"></span><span id="Code_Open_Text_200504" style="display: none"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;MemDC.h<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#ifndef&nbsp;_MEMDC_H_<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;_MEMDC_H_<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #808080; ">////////////////////////////////////////////////</span><span style="color: #008000; ">//</span><span style="color: #808080; "><br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #808080; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;CMemDC&nbsp;-&nbsp;memory&nbsp;DC<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Author:&nbsp;Keith&nbsp;Rule<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Email:&nbsp;&nbsp;keithr@europa.com<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Copyright&nbsp;1996-1999,&nbsp;Keith&nbsp;Rule<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;You&nbsp;may&nbsp;freely&nbsp;use&nbsp;or&nbsp;modify&nbsp;this&nbsp;code&nbsp;provided&nbsp;this<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Copyright&nbsp;is&nbsp;included&nbsp;in&nbsp;all&nbsp;derived&nbsp;versions.<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;History&nbsp;-&nbsp;10/3/97&nbsp;Fixed&nbsp;scrolling&nbsp;bug.<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Added&nbsp;print&nbsp;support.&nbsp;-&nbsp;KR<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11/3/99&nbsp;Fixed&nbsp;most&nbsp;common&nbsp;complaint.&nbsp;Added<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;background&nbsp;color&nbsp;fill.&nbsp;-&nbsp;KR<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11/3/99&nbsp;Added&nbsp;support&nbsp;for&nbsp;mapping&nbsp;modes&nbsp;other&nbsp;than<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MM_TEXT&nbsp;as&nbsp;suggested&nbsp;by&nbsp;Lee&nbsp;Sang&nbsp;Hun.&nbsp;-&nbsp;KR<br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;This&nbsp;class&nbsp;implements&nbsp;a&nbsp;memory&nbsp;Device&nbsp;Context&nbsp;which&nbsp;allows<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;flicker&nbsp;free&nbsp;drawing.</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #008000; "></span><span style="color: #0000FF; ">class</span>&nbsp;CMemDC&nbsp;:&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;CDC&nbsp;{<br /><span style="color: #008080; ">26</span>&nbsp;<span style="color: #0000FF; ">protected</span>:<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;CBitmap&nbsp;&nbsp;m_bitmap;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Offscreen&nbsp;bitmap</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;CBitmap*&nbsp;m_oldBitmap;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;bitmap&nbsp;originally&nbsp;found&nbsp;in&nbsp;CMemDC</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;CDC*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pDC;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Saves&nbsp;CDC&nbsp;passed&nbsp;in&nbsp;constructor</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;CRect&nbsp;&nbsp;&nbsp;&nbsp;m_rect;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Rectangle&nbsp;of&nbsp;drawing&nbsp;area.</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;BOOL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_bMemDC;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TRUE&nbsp;if&nbsp;CDC&nbsp;really&nbsp;is&nbsp;a&nbsp;Memory&nbsp;DC.</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Construct(CDC*&nbsp;pDC)<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(pDC&nbsp;!=&nbsp;NULL);&nbsp;<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Some&nbsp;initialization</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pDC&nbsp;=&nbsp;pDC;<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_oldBitmap&nbsp;=&nbsp;NULL;<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_bMemDC&nbsp;=&nbsp;!pDC-&gt;IsPrinting();<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(m_bMemDC)&nbsp;{<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Create&nbsp;a&nbsp;Memory&nbsp;DC</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CreateCompatibleDC(pDC);<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDC-&gt;LPtoDP(&amp;m_rect);<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_bitmap.CreateCompatibleBitmap(pDC,&nbsp;m_rect.Width(),&nbsp;m_rect.Height());<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_oldBitmap&nbsp;=&nbsp;SelectObject(&amp;m_bitmap);<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetMapMode(pDC-&gt;GetMapMode());<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDC-&gt;DPtoLP(&amp;m_rect);<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetWindowOrg(m_rect.left,&nbsp;m_rect.top);<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Make&nbsp;a&nbsp;copy&nbsp;of&nbsp;the&nbsp;relevent&nbsp;parts&nbsp;of&nbsp;the&nbsp;current&nbsp;DC&nbsp;for&nbsp;printing</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">50</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_bPrinting&nbsp;=&nbsp;pDC-&gt;m_bPrinting;<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_hDC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;pDC-&gt;m_hDC;<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_hAttribDC&nbsp;=&nbsp;pDC-&gt;m_hAttribDC;<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Fill&nbsp;background&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">55</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FillSolidRect(m_rect,&nbsp;pDC-&gt;GetBkColor());<br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">57</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TRK&nbsp;begin</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">58</span>&nbsp;<span style="color: #008000; "></span><span style="color: #0000FF; ">public</span>:<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;CMemDC(CDC*&nbsp;pDC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;:&nbsp;CDC()&nbsp;{&nbsp;pDC-&gt;GetClipBox(&amp;m_rect);&nbsp;Construct(pDC);&nbsp;}<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;CMemDC(CDC*&nbsp;pDC,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;RECT&amp;&nbsp;rect)&nbsp;:&nbsp;CDC()&nbsp;{&nbsp;m_rect&nbsp;=&nbsp;rect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;Construct(pDC);&nbsp;}<br /><span style="color: #008080; ">61</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TRK&nbsp;end</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">62</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;~CMemDC()<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(m_bMemDC)&nbsp;{<br /><span style="color: #008080; ">65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Copy&nbsp;the&nbsp;offscreen&nbsp;bitmap&nbsp;onto&nbsp;the&nbsp;screen.</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">66</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pDC-&gt;BitBlt(m_rect.left,&nbsp;m_rect.top,&nbsp;m_rect.Width(),&nbsp;m_rect.Height(),<br /><span style="color: #008080; ">67</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>,&nbsp;m_rect.left,&nbsp;m_rect.top,&nbsp;SRCCOPY);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">Swap&nbsp;back&nbsp;the&nbsp;original&nbsp;bitmap.</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">69</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SelectObject(m_oldBitmap);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br /><span style="color: #008080; ">71</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;All&nbsp;we&nbsp;need&nbsp;to&nbsp;do&nbsp;is&nbsp;replace&nbsp;the&nbsp;DC&nbsp;with&nbsp;an&nbsp;illegal&nbsp;value,<br /></span><span style="color: #008080; ">72</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;this&nbsp;keeps&nbsp;us&nbsp;from&nbsp;accidently&nbsp;deleting&nbsp;the&nbsp;handles&nbsp;associated&nbsp;with<br /></span><span style="color: #008080; ">73</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;the&nbsp;CDC&nbsp;that&nbsp;was&nbsp;passed&nbsp;to&nbsp;the&nbsp;constructor.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">74</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_hDC&nbsp;=&nbsp;m_hAttribDC&nbsp;=&nbsp;NULL;<br /><span style="color: #008080; ">75</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">76</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">77</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Allow&nbsp;usage&nbsp;as&nbsp;a&nbsp;pointer&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">78</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;CMemDC*&nbsp;<span style="color: #0000FF; ">operator</span>-&gt;()&nbsp;<br /><span style="color: #008080; ">79</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">80</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">this</span>;<br /><span style="color: #008080; ">81</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">82</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Allow&nbsp;usage&nbsp;as&nbsp;a&nbsp;pointer&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">83</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;CMemDC*()&nbsp;<br /><span style="color: #008080; ">84</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">85</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">this</span>;<br /><span style="color: #008080; ">86</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">87</span>&nbsp;};<br /><span style="color: #008080; ">88</span>&nbsp;<span style="color: #0000FF; "></span></span></div><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">使用方法类同前面所述：</span>&nbsp;<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><img id="Code_Closed_Image_200537" onclick="this.style.display='none'; Code_Closed_Text_200537.style.display='none'; Code_Open_Image_200537.style.display='inline'; Code_Open_Text_200537.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_200537" style="display: none" onclick="this.style.display='none'; Code_Open_Text_200537.style.display='none'; Code_Closed_Image_200537.style.display='inline'; Code_Closed_Text_200537.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span id="Code_Closed_Text_200537" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"></span><span id="Code_Open_Text_200537" style="display: none"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #808080; ">/////////////////////////////////////////////////////////</span><span style="color: #008000; ">//&nbsp;</span><span style="color: #808080; "><br /></span><span style="color: #008080; ">2</span>&nbsp;<span style="color: #808080; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;How&nbsp;to&nbsp;use:&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">3</span>&nbsp;<span style="color: #008000; "></span><span style="color: #808080; ">/////////////////////////////////////////////////////////</span><span style="color: #008000; ">//&nbsp;</span><span style="color: #808080; "><br /></span><span style="color: #008080; ">4</span>&nbsp;<span style="color: #808080; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;1、响应WM_ERASEBKGND消息，返回FALSE，这样就不擦除背景了。&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">5</span>&nbsp;<span style="color: #008000; "></span>BOOL&nbsp;CDemoView::OnEraseBkgnd(CDC*&nbsp;pDC)&nbsp;&nbsp;<br /><span style="color: #008080; ">6</span>&nbsp;{&nbsp;<br /><span style="color: #008080; ">7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;FALSE;&nbsp;<br /><span style="color: #008080; ">8</span>&nbsp;}&nbsp;<br /><span style="color: #008080; ">9</span>&nbsp;<span style="color: #808080; ">/////////////////////////////////////////////////////////</span><span style="color: #008000; "></span></span></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><img id="Code_Closed_Image_200554" onclick="this.style.display='none'; Code_Closed_Text_200554.style.display='none'; Code_Open_Image_200554.style.display='inline'; Code_Open_Text_200554.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_200554" style="display: none" onclick="this.style.display='none'; Code_Open_Text_200554.style.display='none'; Code_Closed_Image_200554.style.display='inline'; Code_Closed_Text_200554.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span id="Code_Closed_Text_200554" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"></span><span id="Code_Open_Text_200554" style="display: none"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;2、在需要作图的地方使用CMemDC。&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; "></span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;CDemoView::OnDraw(CDC*&nbsp;pDC)&nbsp;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;&nbsp;{&nbsp;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CFont&nbsp;&nbsp;font;&nbsp;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font.CreateFontIndirect(&amp;m_lf);&nbsp;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMemDC&nbsp;&nbsp;pMemDC(pDC);&nbsp;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CFont*&nbsp;oldfont&nbsp;=&nbsp;pMemDC-&gt;SelectObject(&amp;font);&nbsp;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">..Draw&nbsp;something&nbsp;here.&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pMemDC-&gt;SelectObject(oldfont);&nbsp;<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;}&nbsp;<br /><span style="color: #008080; ">11</span>&nbsp;<span style="color: #808080; ">/////////////////////////////////////////////////////////</span><span style="color: #008000; ">//&nbsp;</span><span style="color: #808080; "><br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #808080; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;别忘了加include头文件！&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #008000; "></span><span style="color: #808080; ">/////////////////////////////////////////////////////////</span><span style="color: #008000; "></span></span></div><em><strong><br /><br /><br /><br /><br /><br /><br /><br /></strong></em><p>&nbsp;</p><br /><p>&nbsp;</p><img src ="http://www.cppblog.com/Neil210/aggbug/186063.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Neil210/" target="_blank">教主</a> 2012-08-02 20:06 <a href="http://www.cppblog.com/Neil210/archive/2012/08/02/186063.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CmemDC类 的使用方法</title><link>http://www.cppblog.com/Neil210/archive/2012/08/02/186005.html</link><dc:creator>教主</dc:creator><author>教主</author><pubDate>Thu, 02 Aug 2012 02:57:00 GMT</pubDate><guid>http://www.cppblog.com/Neil210/archive/2012/08/02/186005.html</guid><wfw:comment>http://www.cppblog.com/Neil210/comments/186005.html</wfw:comment><comments>http://www.cppblog.com/Neil210/archive/2012/08/02/186005.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Neil210/comments/commentRss/186005.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Neil210/services/trackbacks/186005.html</trackback:ping><description><![CDATA[<span>CMemDC其实就是对内存DC的创建与删除进行一个包装。</span><br /><span>1、在CMemDC的构造函数中创建内存DC；</span><br /><span>2、用户可以在CMemDC dc中进行图像的绘制；</span><br /><span>3、在CMemDC的析构函数中进行内存DC到目标DC的拷贝，并做相应的GDI对象清理工作。</span><br /><br /><span>使用这样的类可以让你的代码有很大程度的简洁。</span><br /><br /><span>举个例子：</span><br /><span>如果我们不使用CMemDC，一般我们会写下面的一段的代码，</span><br /><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->CView::OnDraw(CDC*&nbsp;pDC)<br />{<br />&nbsp;&nbsp;CRect&nbsp;rcClient;<br />&nbsp;&nbsp;GetClientRect(&amp;rcClient);<br />&nbsp;&nbsp;CDC&nbsp;dcMem;<br />&nbsp;&nbsp;dcMem.CreateCompatibleDC(pDC);<br />&nbsp;&nbsp;CBitmap&nbsp;bmpMem;<br />&nbsp;&nbsp;bmpMem.CreateCompatibleBitmap(pDC,rcClient.Width(),rcClient.Height());<br />&nbsp;&nbsp;CBitmap&nbsp;*pBmpOld&nbsp;=&nbsp;dcMem.SelectObject(&amp;bmpMem);<br /><br />&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">下面进行图像的绘制</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;dcMem.DrawText();<br />&nbsp;&nbsp;dcMem.FillSolidRect();<br /><br />&nbsp;&nbsp;pDC-&gt;BitBlt(rcClient.left,rcClient.top,rcClient.Width(),rcClient.Height(),<br />&nbsp;&nbsp;&amp;dcMem,0,0,SRCCOPY);<br /><br />&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">GDI对象的清理</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;dcMem.SelectObject(pBmpOld);<br />&nbsp;&nbsp;bmpMem.DeleteObject();<br />&nbsp;&nbsp;dcMem.DeleteDC();<br />}</div></div><span>如果我们使用了CMemDC，那么代码就可以这样写，简洁了很多，更便于维护而且不容易出错。</span><br /><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->CView::OnDraw(CDC*&nbsp;pDC)<br />{<br />&nbsp;&nbsp;CMemDC&nbsp;dcMem(pDC);<br />&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">下面进行图像的绘制</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;dcMem.DrawText();<br />&nbsp;&nbsp;dcMem.FillSolidRect();<br />}</div></div><br /><span>一般不用自己写个类,不过有封装更好.</span><br /><span>简单来说,步骤这样:(比如你真正的使用CDC *dc来绘制)</span><br /><span>1.建立dc的内存DC</span><br /><span>m_MemDc.CreateCompatibleDC(dc);</span><br /><span>2.创建画布</span><br /><span>m_bmp.CreateCompatibleBitmap(dc,宽度,高度);</span><br /><span>3.选择画布</span><br /><span>m_oldBmp = m_MemDc.SelectObject(&amp;m_bmp);</span><br /><span>4.内存Dc绘制东西</span><br /><span>...</span><br /><span>...</span><br /><span>绘制自己需要的东西</span><br /><span>5.使用真正绘图的dc拷贝内存dc的内容</span><br /><span>dc.BitBlt(left,top,宽度,高度,&amp;m_MemDc,m_MemDc中的起始X,m_MemDc中的起始y,SRCCOPY)</span><br /><span>6.最后这个内存DC释放掉</span><br /><span>m_MemDc.DeleteDC();</span>&nbsp;<br /><br />CMemDC类&nbsp;<span>其主要功能其实就是提供一个内存DC用于绘制，用于消除绘制时的闪烁，即双缓存机制。<br />一般来说，我们将将要显示的图首先绘制在内存DC上，然后在要显示的时候整个更新到前台DC上（使用BitBlt）。</span><br /><span>我们首先来看一下CMemDC类的数据成员</span><br /><span>private:&nbsp;&nbsp;</span><br /><span>&nbsp;&nbsp;CBitmap&nbsp;&nbsp;m_bitmap;&nbsp;&nbsp;// Offscreen bitmap</span><br /><span>&nbsp;&nbsp;CBitmap*&nbsp;&nbsp;m_oldBitmap;&nbsp;&nbsp;// bitmap originally found in CMemDC</span><br /><span>&nbsp;&nbsp;CDC*&nbsp;&nbsp;&nbsp;&nbsp;m_pDC;&nbsp;&nbsp;// Saves CDC passed in constructor</span><br /><span>&nbsp;&nbsp;CRect&nbsp;&nbsp;&nbsp;&nbsp;m_rect;&nbsp;&nbsp;// Rectangle of drawing area.</span><br /><span>&nbsp;&nbsp;BOOL&nbsp;&nbsp;&nbsp;&nbsp;m_bMemDC;&nbsp;&nbsp;// TRUE if CDC really is a Memory DC.</span><br /><span>可以看到这当中有两个重要的元素：m_bitmap和m_pDC。打个也许不大恰当的比方，<br />m_pDC指向的CDC对象好比是一张画板，我们将画画在上面，画好的画就是m_bitmap。<br />当我们将内存DC用BitBlt到前台DC的时候，正好就是将刚刚画的画显示到前台。</span><br /><br /><br /><img src ="http://www.cppblog.com/Neil210/aggbug/186005.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Neil210/" target="_blank">教主</a> 2012-08-02 10:57 <a href="http://www.cppblog.com/Neil210/archive/2012/08/02/186005.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>