我用了一个自绘的CListCtrl,重写了DrawItem函数,但发现第一列的CImageList文件图标在拉动水平滚动条后出现没刷新,导致图标多层重叠看不清。想请问该怎么处理。void CColorListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
TCHAR lpBuffer[256]; LV_ITEM lvi; lvi.mask = LVIF_TEXT | LVIF_PARAM|LVIF_IMAGE ;
lvi.iItem = lpDrawItemStruct->itemID ;
lvi.iSubItem = 0;
lvi.pszText = lpBuffer ;
lvi.cchTextMax = sizeof(lpBuffer); VERIFY(GetItem(&lvi)); CDC* pDC;
pDC = CDC::FromHandle(lpDrawItemStruct->hDC); CRect rcImage;
if (!GetSubItemRect(lpDrawItemStruct->itemID,0,LVIR_LABEL,rcImage))
return; //==如果有图标,则绘制图标 added on 2010-12-10 by guxi
CImageList *pImageList = NULL;
pImageList = GetImageList(LVSIL_SMALL);
if(pImageList)
{
IMAGEINFO imageinfo;
if(pImageList->GetImageInfo(lvi.iImage,&imageinfo))
{
pImageList->DrawIndirect( pDC, lvi.iImage, CPoint(0,rcImage.top), CSize(imageinfo.rcImage.right-imageinfo.rcImage.left,imageinfo.rcImage.bottom-imageinfo.rcImage.top), CPoint(0,0));
//pImageList->Draw(pDC,lvi.iImage,CPoint(0,rcImage.top),ILD_NORMAL); //此处画图的位置很重要
}
} ……
……
}
{
TCHAR lpBuffer[256]; LV_ITEM lvi; lvi.mask = LVIF_TEXT | LVIF_PARAM|LVIF_IMAGE ;
lvi.iItem = lpDrawItemStruct->itemID ;
lvi.iSubItem = 0;
lvi.pszText = lpBuffer ;
lvi.cchTextMax = sizeof(lpBuffer); VERIFY(GetItem(&lvi)); CDC* pDC;
pDC = CDC::FromHandle(lpDrawItemStruct->hDC); CRect rcImage;
if (!GetSubItemRect(lpDrawItemStruct->itemID,0,LVIR_LABEL,rcImage))
return; //==如果有图标,则绘制图标 added on 2010-12-10 by guxi
CImageList *pImageList = NULL;
pImageList = GetImageList(LVSIL_SMALL);
if(pImageList)
{
IMAGEINFO imageinfo;
if(pImageList->GetImageInfo(lvi.iImage,&imageinfo))
{
pImageList->DrawIndirect( pDC, lvi.iImage, CPoint(0,rcImage.top), CSize(imageinfo.rcImage.right-imageinfo.rcImage.left,imageinfo.rcImage.bottom-imageinfo.rcImage.top), CPoint(0,0));
//pImageList->Draw(pDC,lvi.iImage,CPoint(0,rcImage.top),ILD_NORMAL); //此处画图的位置很重要
}
} ……
……
}
pImageList->DrawIndirect( pDC, lvi.iImage, CPoint(0,rcImage.top), CSize(imageinfo.rcImage.right-imageinfo.rcImage.left,imageinfo.rcImage.bottom-imageinfo.rcImage.top), CPoint(0,0));CPoint(0,rcImage.top)不该总是从0开始
获取图标位置应该用 if (!GetSubItemRect(lpDrawItemStruct->itemID,0,LVIR_ICON,rcImage))
绘制位置应为rcImage.TopLeft()
HOHO~~~
感谢两位,散分给你们吧
int iItem,
int iSubItem,
int nArea,
CRect& ref
);nAreaLVIR_LABEL Returns the bounding rectangle of the entire item, including the icon and label. This is identical to LVIR_BOUNDS.