修改后的CMemDC類:(增加了紅色的那行,非常重要喔。另外加了些注釋)
/////////////////////////////////////////////////////////////////////////////
// CMemDC
class CMemDC : public CDC
{
public:
?? CDCHandle???? m_dc;????????? // 屏幕的DC Owner DC
?? CBitmap?????? m_bitmap;????? // Offscreen bitmap
?? CBitmapHandle m_hOldBitmap;? // Originally selected bitmap
?? RECT????????? m_rc;????????? // Rectangle of drawing area
?? CMemDC(HDC hDC, LPRECT pRect, COLORREF clrBackGround = 0)
?? {
????? ATLASSERT(hDC!=NULL);
?? //保存屏幕的DC到m_dc中
?? m_dc = hDC;
????? if( pRect!=NULL )
?? {
??? m_rc = *pRect;
?? }
?? else
?? {
??? m_dc.GetClipBox(&m_rc);
?? }
?? //將被本窗口覆蓋了的父窗口的區域填充至本窗口的背景
??? //調用CDC的CreateCompatibleDC(),它會給父類CDC的成員變量m_hDC賦值
?? CreateCompatibleDC(hDC);
??
????? ::LPtoDP(hDC, (LPPOINT) &m_rc, sizeof(RECT)/sizeof(POINT));
?? //讀取屏幕位圖到m_bitmap
????? m_bitmap.CreateCompatibleBitmap(hDC, m_rc.right-m_rc.left, m_rc.bottom-m_rc.top);
??
?? //CDC選擇新位圖,并保存舊的位圖
????? m_hOldBitmap = SelectBitmap(m_bitmap);
?? //在CDC中畫圖,將原先的屏幕復制到內存中
?? BitBlt(0, 0, m_rc.right-m_rc.left, m_rc.bottom-m_rc.top, hDC, m_rc.left, m_rc.top, SRCCOPY);
?? //設置CDC的背景色為#FF00FF
?? SetBkColor(RGB(0,255,0));
????? ::DPtoLP(m_dc, (LPPOINT) &m_rc, sizeof(RECT)/sizeof(POINT));
????? SetWindowOrg(m_rc.left, m_rc.top);
?? //add by Robert
?? if(clrBackGround != 0)
?? {
??CBrush brush;
??brush.CreateSolidBrush(clrBackGround);
??FillRect(pRect, (HBRUSH)brush);
?? }
?? //end add
?? }
?? ~CMemDC()
?? {
????? // Copy the offscreen bitmap onto the screen.
??? //注意,是從父類的m_hDC中復制位圖到屏幕
????? m_dc.BitBlt(m_rc.left, m_rc.top, m_rc.right-m_rc.left, m_rc.bottom-m_rc.top,
????????????????? m_hDC, m_rc.left, m_rc.top, SRCCOPY);
????? // CDC恢復以前的位圖 Swap back the original bitmap.
????? SelectBitmap(m_hOldBitmap);
?? }
};
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
