重载ListBox中的DrawItem,改变Item字,但一选中又变回原来的字体,怎么处理?高手们

重载ListBox中的DrawItem,改变Item字,但一选中又变回原来的字体,怎么办?高手们。
本帖最后由 VisualEleven 于 2014-08-19 13:21:29 编辑
重载ListBox中的DrawItem,改变Item字,但一选中又变回原来的字体,怎么办?高手们。
 void MyListBox::DrawItem (LPDRAWITEMSTRUCT lpdis)
{
CDC dc;
    dc.Attach (lpdis->hDC);
    CRect rect = lpdis->rcItem;
    int nIndex = lpdis->itemID;

    CBrush* pBrush = new CBrush;
    pBrush->CreateSolidBrush (::GetSysColor ((lpdis->itemState &
        ODS_SELECTED) ? COLOR_HIGHLIGHT : COLOR_WINDOW));
    dc.FillRect (rect, pBrush);
delete pBrush;

    if (lpdis->itemState & ODS_FOCUS)
        dc.DrawFocusRect (rect);
   /* dc.DrawIcon (rect.left + 4, rect.top + 2,
            (HICON) GetItemData (nIndex));*/

if (nIndex != (UINT) -1)

CFont *pFont=new CFont;
pFont->CreateFont(40,16,0,0,100,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
        CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_SWISS,_T("Arial"));
 dc.SelectObject(&pFont);
SetBkMode(dc,TRANSPARENT);
LPCTSTR pstr=(LPCTSTR)lpdis->itemData;
CRect stringRect;
stringRect=rect;
stringRect.left+=4;
stringRect.top+=2;
dc.DrawText(pstr, stringRect,DT_CENTER);
dc.SelectObject(pFont);
DeleteObject(&pFont);
}
    dc.Detach ();
}

------解决方案--------------------
你的DeleteObject(&pFont);调用应该会失败的,你之前没有SelectObject 旧的CFont对象。
CFont*  pOldFont = (CFont*)dc.SelectObject(&pFont);
。。。
dc.SelectObject(pOldFont);

delete pFont;
pFont = NULL;