CPintDC和CClientDC的区别

 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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值