Вооружившись знаниями о структуре 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(); }
А вот и результат: