hur.cn - 华软网

 热门搜索

关于释放CDI相关的问题

  作者:未知    来源:网络    更新时间:2010/12/7
    说明:这是我程序的一段代码,其功能是将 001.bmp  以“透明”的效果显示出来,然则由于我这个程序需要对这一段代码调用很屡次。所以造成了“ a required resource was unavailable” 这个毛病,看网上说的是没有释放资源,所以我就在最下面加了释放资源的语句(注:下面带“//****”的行(hang)为为这个释放而加的语句)然则效果还和以前一样运行到一样的地方就 出现“a required resource was unavailable”,实在陌生了,请列位高手指教一下,谢谢啦!!!  
       HBITMAP l_hbmpBitmap=(HBITMAP)::LoadImage  (NULL,“001.bmp”,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
     if( l_hbmpBitmap == NULL )
{
Default() ;
return ;
  }
    CClientDC l_PaintDC(this);
CRect l_rcClient( 0,0,34,34); 
CDC  l_BufferDC ;
 l_BufferDC.CreateCompatibleDC( &l_PaintDC ) ;
CBitmap  l_BufferBitmap ;
 l_BufferBitmap.CreateCompatibleBitmap( &l_PaintDC, l_rcClient.Width(),      l_rcClient.Height() ) ;
CBitmap* l_pOldBufferBitmap = l_BufferDC.SelectObject( &l_BufferBitmap ) ;

CDC  l_MaskDC ;
 l_MaskDC.CreateCompatibleDC( &l_PaintDC ) ;
CBitmap  l_MaskBitmap ;
 l_MaskBitmap.CreateBitmap( l_rcClient.Width(), l_rcClient.Height(), 1, 1, NULL ) ;
CBitmap* l_pOldMaskBitmap = l_MaskDC.SelectObject( &l_MaskBitmap ) ;

#define ROP4_TRANSPARENTBLIT 0xCCAA0020
#define SRCMASK 0x00220326
CDC  l_MemoryDC ;
 l_MemoryDC.CreateCompatibleDC( &l_PaintDC ) ;
CBitmap* l_pOldMemoryBitmap = l_MemoryDC.SelectObject( CBitmap::FromHandle( l_hbmpBitmap ) ) ;
l_BufferDC.BitBlt( 0,0,l_rcClient.Width(), l_rcClient.Height(), &l_MemoryDC, 0,0, SRCCOPY ) ;
l_MemoryDC.SelectObject( l_pOldMemoryBitmap ) ;
COLORREF l_crOldBack = l_BufferDC.SetBkColor( RGB( 255, 0, 255 ) ) ;
l_MaskDC.BitBlt(0,0, l_rcClient.Width(), l_rcClient.Height(), &l_BufferDC, 0,0, SRCCOPY ) ;
l_BufferDC.SetBkColor( l_crOldBack ) ;
if( ! l_PaintDC.MaskBlt(   posX,posY,
l_rcClient.Width(),
 l_rcClient.Height(),
 &l_BufferDC,
0,0,
 l_MaskBitmap,
0,0,
ROP4_TRANSPARENTBLIT ) )
{
CDC  l_CopyDC ;
 l_CopyDC.CreateCompatibleDC( &l_PaintDC ) ;
CBitmap  l_CopyBitmap ;
 l_CopyBitmap.CreateCompatibleBitmap( &l_PaintDC, l_rcClient.Width(), l_rcClient.Height() ) ;
CBitmap* l_pOldCopyBitmap = l_CopyDC.SelectObject( &l_CopyBitmap ) ;
l_CopyDC.BitBlt( posX,posY, l_rcClient.Width(), l_rcClient.Height(), &l_PaintDC, posX,posY, SRCCOPY  ) ;
l_CopyDC.BitBlt(  posX,posY,l_rcClient.Width(), l_rcClient.Height(), &l_MaskDC,0,0, SRCAND   ) ;
l_BufferDC.BitBlt(0,0,l_rcClient.Width(), l_rcClient.Height(), &l_MaskDC,0,0,SRCMASK  ) ;
l_CopyDC.BitBlt(posX,posY,l_rcClient.Width(), l_rcClient.Height(), &l_BufferDC,0,0,SRCPAINT ) ;
l_PaintDC.BitBlt( posX,posY,l_rcClient.Width(), l_rcClient.Height(), &l_CopyDC, posX,posY, SRCCOPY  ) ;
CClientDC dc(this);
//dc.TextOut(l_rcClient.Width(),l_rcClient.Height(),"jjj");
l_CopyDC.SelectObject( l_pOldCopyBitmap ) ;


l_CopyBitmap.DeleteObject();
l_CopyDC.DeleteDC();

}
l_MaskDC.SelectObject( l_pOldMaskBitmap ) ;
l_BufferDC.SelectObject( l_pOldBufferBitmap ) ;

         l_MaskBitmap.DeleteObject();//****
l_BufferBitmap.DeleteObject();//****
     l_MemoryDC.DeleteDC();//****
     l_MaskDC.DeleteDC();//****
l_BufferDC.DeleteDC();//****
}    
}
}
---华软 网友回答---
  class="deleted_message"> 该回复于2010-12-08 09:59:51被版主删除
---华软网友回复---
还要用 DeleteObject 释放 HBITMAP l_hbmpBitmap 这类的资源。
---华软网友回复---
图片不需要每次都load进来
---华软网友回复---
谢谢两位啦!!看了你们的回帖茅塞顿开呀  呵呵 现在问题已经解决啦  真是万分谢谢!!      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。