void CPictureWnd::SetBitmap(UINT uBmpResource, UINT uCtrlResource)     
{   
//--加载图片的函数
HBITMAP hBitmap;   
CStatic *pStatic = (CStatic *)GetDlgItem(uCtrlResource); hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(),     
     MAKEINTRESOURCE(uBmpResource),     
     IMAGE_BITMAP,     
     0,     
     0,     
     LR_LOADMAP3DCOLORS);   pStatic->ModifyStyle(0xF, SS_BITMAP);   
pStatic->SetBitmap(hBitmap); 
}   我用这个函数加载bmp图片,为什么有时偶尔加载空了,什么也没有,程序重启后就好了,这是为什么了?

解决方案 »

  1.   

    1、是你对指针和位图句柄的合法性都没有进行过判断
    2、没必要每次都加载,因为很可能你会多次反复load某几个位图资源。完全可以做一个list保存已经加载过的位图句柄。或者你可以每次加载位图之后,DeleteObject释放资源。
      

  2.   

    每次我都刷新了CRect rect = NULL ;   
    rect.NormalizeRect(); 
    InvalidateRect(rect,true);1、是你对指针和位图句柄的合法性都没有进行过判断  这个怎么讲了?
      

  3.   

    CStatic *pStatic = (CStatic *)GetDlgItem(uCtrlResource);hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(),    这两个语句都有可能返回空值。
      

  4.   

    HBITMAP hBitmap;   
    CStatic *pStatic = (CStatic *)GetDlgItem(uCtrlResource); hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(),     
         MAKEINTRESOURCE(uBmpResource),     
         IMAGE_BITMAP,     
         0,     
         0,     
         LR_LOADMAP3DCOLORS);  
    if( hBitmap && pStatic)
    {
        pStatic->ModifyStyle(0xF, SS_BITMAP);   
        pStatic->SetBitmap(hBitmap); 
    }   这样做一下处理就没问题了吧
      

  5.   


       我这里就是多次反复加载几个位图资源,没有DeleteObject释放资源,会是这个导致加载失败吗?
      

  6.   

    把SetBitmap的返回值DeleteObject。另外注意调用该函数时给的参数是否正确。
      

  7.   

    从资源加载位图,用LoadBitmap即可。另外你这样多次加载没有保留hBitmap句柄,没有删除GDI对象,久而久之GDI资源泄漏是存在的。
      

  8.   

    GDI中的对象什么时候才需要用DeleteObject().    当使用构造函数构造一个GDI对象的时候不需要调用DeleteObject(),如果是调用Create**函数创建的则需要调用DeleteObject()。如:1. CPen pen(m_stytle,m_width,col); //不需要调用DeleteObject(),会自动删除。
    2. CPen pen;
        pen.CreatePen(m_stytle,m_width,col);//需要调用DeleteObject().                那我这样做就不需要DeleteObject()了不是吗?
      

  9.   

    void CPictureWnd::SetBitmap(UINT uBmpResource, UINT uCtrlResource)    
    {
    CStatic *pStatic = (CStatic *)GetDlgItem(uCtrlResource); 
    HBITMAP hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), 
        MAKEINTRESOURCE(uBmpResource), 
        IMAGE_BITMAP, 
        0, 
        0, 
        LR_LOADMAP3DCOLORS);
    pStatic->ModifyStyle(SS_TYPEMASK, SS_BITMAP);
    DeleteObject(pStatic->SetBitmap(hBitmap));
    }CPen类不用DeleteObject,是因为CPen类在析构的时候会自动删除对象。
      

  10.   

      问题已经解决,我是这样做的,将HBITMAP hBitmap 定义成窗体类的一个成员变量,
    每次加载之前:              //--先释放先前加载的位图资源
             if( hBitmap != NULL )
         DeleteObject(hBitmap);
      那种加载为空的现象没有了,呵呵
                                    
                                         谢谢各位,又学到了不少的东西啊