关于HDC CDC的释放

首先:

HDC   hDC   =   GetDC(hWnd);  
CDC   *pDC   =   CDC::FromHandle(hDC);

对于以上代码,通过FromHandle得到的 CDC 不可以释放. FromHandle 是通过 HDC 来创建了一个 CDC 对象,以方便操作,释放 DC 的操作应该针对于 HDC 而非此 CDC , 如果释放了它   pDC->ReleaseDC   ,就会造成隐患.        
这两者是指向的一个DC对象,只能释放一次,而这个释放应该针对 hDC 而非 pDC.  

 

然后:

GetDC和ReleaseDC的調用配對,CreateDC和DeleteDC的調用配對。
GetDC是從窗口獲取現有的DC,而CreateDC是創建DC,所以ReleaseDC和DeleteDC的作用一個是釋放,一個是銷毀.



请教关于CDC资源释放的问题。


m_HOldBmp = SelectObject( m_hMemDC, m_HBmp );  
  CDC *pDC = new CDC;
if (!pDC)
{
return FALSE;//函数调用多次后,在这里就返回了。
}
pDC->Attach(m_hMemDC);

//...使用pDC..代码略

pDC->Detach();

m_HBmp=(HBITMAP) SelectObject( m_hMemDC, m_HOldBmp );

return TRUE;


问题:
1.请教如何释放该CDC资源;
2.为什么反复new CDC后出错呢?

------解决方案--------------------
1.请教如何释放该CDC资源;
====================
对CDC来说,将与CDC相关的DC资源释放掉,然后用delete将这个指针释放掉

2.为什么反复new CDC后出错呢?
==========
可能是申请太多,GDI资源已经不够用了。 
------解决方案--------------------
这样New CDC 的用法没试过。通常在View类里面 CDC*pDC = GetDC(); 然后 ReleaseDC(pDC); 或者在对话框里面CPaintDC dc(this);或者使用CClientDC等。你是什么项目?不是MFC项目吗?感觉这样反复new CDC不怎么合理似的。 
------解决方案--------------------
Cdc获取后一定要释放,如果一直New而不delete就会内存不足而出错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值