我在CListCtrl中加载背景图片和一些其它图片时。在OnEraseBkgnd和DrawItem中把HBITMAP设置成局部变量,调用LoadImage加载图片时,显示没问题。但是当我把HBITMAP用成员变量,在SetRowImageEx函数中调用LoadImage,然后在OnEraseBkgnd和DrawItem显示图片就会变成全黑色的。不知道为什么会这样。函数如下:
void CListCtrlEx::SetRowImageEx(LPCSTR lpDir,COLORREF crMask,LPCSTR lpTromotion,LPCSTR lpIco,LPCSTR lpMouse,LPCSTR lpCheck)
{
m_hBMPRow=(HBITMAP)::LoadImage(AfxGetInstanceHandle(), lpDir, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
m_hBMPTromotion=(HBITMAP)::LoadImage(AfxGetInstanceHandle(), lpTromotion, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
    m_hBMPIco=(HBITMAP)::LoadImage(AfxGetInstanceHandle(), lpIco, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
    m_hBMPMouse=(HBITMAP)::LoadImage(AfxGetInstanceHandle(), lpMouse, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
    m_hBMPCheck=(HBITMAP)::LoadImage(AfxGetInstanceHandle(), lpCheck, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
}void CListCtrlEx::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{ // TODO:  添加您的代码以绘制指定项
ASSERT(lpDrawItemStruct->CtlType == ODT_LISTVIEW);  
CDC dc;   
dc.Attach(lpDrawItemStruct->hDC);  
ASSERT(NULL != dc.GetSafeHdc());  
// Save these value to restore them when done drawing.   
COLORREF crOldTextColor = dc.GetTextColor();  
COLORREF crOldBkColor = dc.GetBkColor();  
dc.SetTextColor(RGB(52,101,141)); 
// If this item is selected, set the background color    
// and the text color to appropriate values. Also, erase   
// rect by filling it with the background color.   
if ((lpDrawItemStruct->itemAction | ODA_SELECT) &&  
(lpDrawItemStruct->itemState & ODS_SELECTED))  
{  
                           CBitmap bitmap;
BITMAP bm;                           //HBITMAP hBitmap;这是以局部变量的方式定义,图片能正常显示
                           //hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(), m_strImageRowPath, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE); 
                           //bitmap.Attach(hBitmap);   bitmap.Attach(m_hBMPCheck);//用成员变量就会变成黑色的图片  
bitmap.GetBitmap(&bm);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
dcMem.SelectObject(&bitmap);
dc.StretchBlt(0,lpDrawItemStruct->rcItem.top-1,bm.bmWidth,bm.bmHeight,&dcMem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);

         }

 }

解决方案 »

  1.   

    bitmap.Attach(m_hBMPCheck);//用成员变量就会变成黑色的图片   
    m_hBMPCheck是否有效。LoadImage没有释放
      

  2.   

    我在InitDialog中调用SetRowImageEx(),并且判断m_hBMPCheck并不为空.LoadImage释放应该是在析构函数中用的.区别就是一个是成员变量,一个是局部变量。在OnEraseBkgnd中使用背景图片也是一样,用成员变量图片就是黑色的。