重绘listbox遇到个有关问题向大家请问

重绘listbox遇到个问题向大家请教
C/C++ code

void CMyListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    // TODO:  添加您的代码以绘制指定项
    COLORREF clrItemText; 
    LPDRAWITEMSTRUCT lpDIS = lpDrawItemStruct; 
    switch ( lpDIS->itemAction ) //lpDIS为一个LPMEASUREITEMSTRUCT(记录控件信息) 
    { 
    case ODA_SELECT: 
    case ODA_DRAWENTIRE: 
        // Is the item selected? 
        if ( lpDIS->itemState & ODS_SELECTED ) 
        { 
            clrItemText = GetSysColor( COLOR_HIGHLIGHTTEXT ); 
            // Clear the rectangle 
            FillRect( lpDIS->hDC, &lpDIS->rcItem, (HBRUSH)(COLOR_ACTIVECAPTION+1) ); 
        } 
        else 
        { 
            clrItemText = GetSysColor( COLOR_WINDOWTEXT ); 
            // Clear the rectangle 
            FillRect( lpDIS->hDC, &lpDIS->rcItem, (HBRUSH)(COLOR_WINDOW+1) ); 
        } 
    } 

    CDC dc; 
    dc.Attach(lpDIS->hDC); 
    CRect rectFull = lpDIS->rcItem; 
    CRect rectName = rectFull; 
    rectName.left = rectFull.left + 60;
    rectName.bottom = rectName.top + 30;
    rectName.right = rectFull.Width() - 1; 
    CRect rectImage = rectFull;
    rectImage.top = rectFull.top + 5;
    rectImage.left = rectFull.left +5;
    rectImage.bottom = rectFull.bottom -5;
    rectImage.right = rectImage.left +50;
    CRect rectID = rectFull;
    rectID.left = rectFull.left + 60;
    rectID.top = rectFull.top + 30;

    UINT nIndex = lpDIS->itemID; 
    LPITEMDATA pItemData = (LPITEMDATA)GetItemDataPtr(nIndex);
    if (nIndex != (UINT) -1) 
    { 
        if(-1 != pItemData->nImage )
        {
            HICON hIco = m_ImageList.ExtractIcon(pItemData->nImage);
            DrawIcon(dc,rectImage.left,rectImage.top,hIco);
        }

        LOGFONT lf; 
        dc.GetCurrentFont()->GetLogFont(&lf); 
        CFont fontUser, fontID, *pOldFont; 
        //lf.lfCharSet = SHIFTJIS_CHARSET; 
        //lstrcpy(lf.lfFaceName,_T("MS Mincho")); 

        lf.lfHeight=25; 
        lf.lfWidth=0; 
        fontUser.CreateFontIndirect(&lf); 
        pOldFont=dc.SelectObject(&fontUser); 
        dc.SetBkMode(TRANSPARENT); 
        dc.SetTextColor(pItemData->crTextColor); 
        dc.DrawText(pItemData->cstrUserName,CRect(rectName.left+3,rectName.top+3, rectName.right-3,rectName.bottom+3), DT_LEFT | DT_SINGLELINE); 

        lf.lfHeight=20; 
        lf.lfWidth=0; 
        fontID.CreateFontIndirect(&lf); 
        dc.SelectObject(&fontID); 
        dc.SetBkMode(TRANSPARENT); 
        dc.SetTextColor(pItemData->crTextColor); 
        dc.DrawText(pItemData->cstrUserID,CRect(rectID.left+3,rectID.top+3, rectID.right-3,rectID.bottom+3), DT_LEFT | DT_SINGLELINE); 

        dc.SelectObject(pOldFont);
    } 
    dc.Detach(); 
}



问题1:拉伸图标大小,将绘图代码改成
IMAGEINFO info;
m_ImageList.GetImageInfo(pItemData->nImage,&info);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
HICON hIco = m_ImageList.ExtractIcon(pItemData->nImage);
DrawIcon(memdc,0,0,hIco);
dc.StretchBlt(rectImage.left,rectImage.top,rectImage.Width(),rectImage.Height(),&memdc,
0,0,info.rcImage.right-info.rcImage.left, info.rcImage.bottom-info.rcImage.top,SRCCOPY);

图标就显示不出来了,不知道什么原因

问题2:选中的item上文字会有背景,并且拉动scrollbar会导致颜色越来越深,如果是黑色的字,最终会被覆盖,刷新就好了。

------解决方案--------------------
dc.StretchBlt看各rect的位置对不

2 绘完后刷新下,Invalidate什么的