CPintDC和CClientDC的区别
最近在使用Vc6.0进行画图时,想实现多张图片进行切换的效果,本次谈谈基于对话框模式的多张图片切换时,CPaintDC和CClientDC的区别。
CPaintDC类、ClientDC类、CWindowDC类和CMetaFileDC类(这里只谈前面两个)。
CPaintDC类是一个来自CDC的设备环境类。它在构造期间执行CWnd::BeginPaint,在析构期间执行CWnd::EndPaint。同时一个CPaintDC对象只在响应一个WM_PAINT消息的时候被使用,通常是在你的OnPaint消息处理成员函数中。
而类CClientDC在构造时调用了Windows函数GetDC,在析构时调用了ReleaseDC。这意味着和CClientDC对象相关的设备上下文是窗口的客户区。
从上面CPaintDC和CClientDC的解释不难看出,CPaintDC是针对整个窗口绘制,而CClientDC只是针对客户区的绘制,所以在使用这两个类获得的DC进行绘图时有本质上的区别:
CPaintDC:需要将以前的窗体Invalidate(),然后重绘新图片;
CClientDC:不需要Invalidate(),只是对客户区的图片区域进行重绘。
以下是一个实例的对比:
====================
CBitmap m_bitmap;
//加载新的位图
m_bitmap.LoadBitmap(BitmapID);
//取得位图的信息
BITMAP m_bm;
if(m_bitmap.GetBitmap(&m_bm) == 0)
return FALSE;
//获取客户区坐标
GetClientRect(&cliRect);
//销毁窗口背景,重绘
Invalidate(TRUE);
CPaintDC dc(this);
(如果是CClientDC,只需要将以上两行替换为:CClientDC dc(this))
CDC dcMem;
//创建上下文关联
if(FALSE == dcMem.CreateCompatibleDC(&dc))
return;
CBitmap *disBitmap = dcMem.SelectObject(&m_bitmap);
if(disBitmap == NULL)
return;
if(FALSE == dc.StretchBlt(cliRect.left, cliRect.top, m_bm.bmWidth, m_bm.bmHeight,
&dcMem, cliRect.left, cliRect.top, m_bm.bmWidth, m_bm.bmHeight, SRCCOPY))
return;
dcMem.DeleteDC();
//删除旧的位图句柄
m_bitmap.DeleteObject();