MFC重绘CListCtrl时DrawItem中绘制CimageList图片

时间:2022-09-17 23:20:00

这几天一直为ClistCtrl重绘后在用Cimagelist重绘图片失败发愁,找资料都是要么没解决答案要么就是那些楼主自己解决但没贴出方法,自己各路问也是无人回答,菜鸟的方法都用尽了,但是功夫不负有心人,还是找到了个解决方法。下面贴出方法

<span style="white-space:pre"></span>if (lvi.iImage >= 0)//大于等于0代表当前item有图片资源要画  图片序号
{

//HBITMAP hBitmap;

IMAGEINFO ImageInfo;
if (m_nImageCount == 1)
{
pImageList->GetImageInfo(0,&ImageInfo);
}
else
{
pImageList->GetImageInfo(lvi.iImage,&ImageInfo);
}


///////////////////////
CDC dcMemory;
dcMemory.CreateCompatibleDC( pDC );
CBitmap Bitmap;
int nWidth = abs(ImageInfo.rcImage.right - ImageInfo.rcImage.left);
int nHeight = abs(ImageInfo.rcImage.bottom - ImageInfo.rcImage.top);

Bitmap.CreateCompatibleBitmap(pDC, nWidth, nHeight);
CBitmap * pBmpOld = dcMemory.SelectObject(&Bitmap);
dcMemory.FillSolidRect(0, 0, nWidth, nHeight, RGB(255,0,0));

pImageList->Draw(&dcMemory, lvi.iImage, CPoint(0,0), ILD_NORMAL);
pDC->BitBlt(picLeft/*0*/ , rcItem.top , ImageInfo.rcImage.right - ImageInfo.rcImage.left, ImageInfo.rcImage.bottom - ImageInfo.rcImage.top, &dcMemory, 0,0,SRCCOPY );
dcMemory.SelectObject(pBmpOld);

dcMemory.DeleteDC();
::DeleteObject( ImageInfo.hbmImage );
::DeleteObject( ImageInfo.hbmMask );
}


有些地方还不成熟,只在第一列显示图片。再处理些逻辑坐标即可图标完善位置

这样我们就能画出图片了,卤煮新手菜鸟。肯定有不对的地方,贴出来一是为了给别人(例如我这样的)找不到解决方法的人,二是给自己留下笔记以防以后忘了。。。。