我用了一个自绘的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);  //此处画图的位置很重要
        } 
    }         ……
    ……
}

解决方案 »

  1.   

    发现问题了,是绘制CImageList图标的位置不对
                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~~~
    感谢两位,散分给你们吧
      

  2.   

    MSDN解释有错哇BOOL GetSubItemRect(
       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.