Вооружившись знаниями о структуре DRAWITEMSTRUCT мы можем изменить код, чтобы наш выделенный пункт в списке отражался другим цветом.
void CTestList::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);
CRect rect;
rect=lpDrawItemStruct->rcItem;
if (lpDrawItemStruct->itemState & ODS_SELECTED)
dc.SetTextColor(RGB(0,255,0));
else dc.SetTextColor(RGB(255,0,0));
dc.DrawText((LPSTR)lpDrawItemStruct->itemData,
rect,DT_LEFT | DT_WORDBREAK);
dc.Detach();
}
Можно пойти дальше и использовать заливки:
if (lpDrawItemStruct->itemState & ODS_SELECTED)
{
CBrush br(RGB(0,0,255));
dc.FillRect(&rect,&br);
dc.SetTextColor(RGB(0,255,0));
} else {
CBrush br(RGB(255,255,255));
dc.FillRect(&rect,&br);
dc.SetTextColor(RGB(255,0,0));
}
Так можно далеко зайти, как говорит моя подруга когда я начинаю ее обнимать :-))) Ну, что выведем рисунок ??? Выведем.
{
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);
CRect rect;
rect=lpDrawItemStruct->rcItem;
SetItemHeight(lpDrawItemStruct->itemID,32);
if (lpDrawItemStruct->itemState & ODS_SELECTED)
{
dc.DrawIcon(rect.left,rect.top,
AfxGetApp()->LoadIcon(IDR_MAINFRAME));
rect.left =rect.left+32;
dc.SetTextColor(RGB(0,255,0));
}
else
{
CBrush br(RGB(255,255,255));
dc.FillRect(&rect,&br);
dc.SetTextColor(RGB(255,0,0));
}
dc.DrawText((LPSTR)lpDrawItemStruct->itemData,
rect,DT_LEFT | DT_WORDBREAK);
dc.Detach();
}
А вот и результат:
