Шаг 277 - Класс CListBox, выбранный элемент другим цветом

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

А вот и результат:

277.gif (1200 b)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.