GDI对象和CDC的使用方法(防止资源泄漏)

1:CDC方面:
       CDC有三种使用方式
       一种是获得,包括GETDC和GETWINDOWDC,这种CDC是引用,使用完了一定要ReleaseDC,不释放就会这个引用过来的CDC资源泄漏,千万不能用DeleteDC,会导致报错或程序崩溃。
       还有一种就是创建,一般是CreateDC,CreateCompatibleDC等,这是创建一个新的DC,使用完了要DeleteDC,如果是NEW的还需要DELETE。如果不是指针,而是一个CDC对象(CDC _dc;),那在使用后也可以不DeleteDC,因为CDC对象的析构函数会调用DeleteDC。
      最后一种是临时的CDC对象,(CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);),这种CDC在我们重载控件的DrawItem函数中经常用到,这类CDC是由系统在空闲时自动释放(没有测试过是否可以手动释放,有兴趣的朋友可以自己试试)。

2:下面说下GDI对象
      我的帖子举例的情况是不会造成内存泄漏的,SelectObject返回的指针是一个临时对象的指针,这个指针是保存在系统的一个MAP里的,对于MAP里的不使用的对象,系统会在空闲时自动释放。
那个例子的结果就是,把新的图片放到了那个CDC里面,CDC里面的默认或是原来的图片被替换删除了,再想用的时候就没有了。举例
1
2
3
4
pDC->TextOut( "11" );
pDC->SelectObject(&cpen);
pDC->TextOut( "22" );


       cpen一个粗线条的笔,正常的想法是11是系统默认粗细的笔,22是粗线条,因为你没有选回系统默认的CPEN( pDC->SelectObject( pOldPen );),当你第二次执行这段代码的时候,11和22都是粗线条的,因为默认的笔已经被你改变了。

3:举例一:

void CMyView::OnPaint( CDC* pDC )
  {
  CBitmap bmp;
  CBitmap* pOldBmp;
  bmp.LoadBitmap(IDB_MYBMP);
  pOldBmp = pDC->SelectObject( &bmp );
  …
  if( Something() ){
  return;
  }
  pDC->SelectObject( pOldBmp );
  return;
  }

      此段代码最大的问题就是在第一个return语句,如果在这种情况下,就执行选回原来的画刷,导致资源不释放,

4:举例二:

HBRUSH CCCIMSystemDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
 HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

 // TODO:  在此更改 DC 的任何属性
 pDC->SetBkMode(TRANSPARENT);
HBRUSH B=CreateSolidBrush(RGB(204,204,255));
 
 return (HBRUSH)B;
 // TODO:  如果默认的不是所需画笔,则返回另一个画笔
 return hbr;
}
       此段代码主要是修改对话框以及控件的背景颜色,但是长时间运行将会发现大量资源泄漏。原因是每次进入此函数都会创建新的HBRUSH B而此对象有作为此函数的返回,即资源不会得到释放,

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值