我在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);
}
。
}
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);
}
。
}
m_hBMPCheck是否有效。LoadImage没有释放