Re[3]: CListCtrl, перерисовка
От: visual_wind  
Дата: 10.01.05 16:30
Оценка: 3 (1)
Здравствуйте, pe, Вы писали:

pe>Здравствуйте, visual_wind, Вы писали:


_>>Здравствуйте, pe, Вы писали:


pe>>>Переопределяю функцию DrawItem в CListCtrl. При перерисовке эта функция вызывается для каждой строки, но перерисовывается при этом только первая строка. Остальные перерисовываются только после кликанья по ним мышой. Как решить эту проблему?


_>>Посмотрите, как Вы используете поле itemID структуры DRAWITEMSTRUCT, это индекс строки.

_>>А лучше, покажите всю функцию.

pe>Функция:

pe>void MyClass::DrawItem(LPDRAWITEMSTRUCT dis) {
pe> CDC dc;
pe> dc.Attach(dis->hDC);
pe> CRect rc = dis->rcItem;
pe> dc.FillRect(&rc, &CBrush(RGB(255, 255, 220)));
dc.Detach();
pe>}

pe>Причем она вызывается для каждой строки и в rc координаты правильные, т.е. соответствующие строке.


Насчет правильности координат возражений нет, а в данной функции Вы забыли вызвать dc.Detach();

Помимо этого, передавать адрес стекового объекта в функцию FillRect нежелательно. Лучше завести переменную типа CBrush в Вашем классе и идин раз проинициализировать ее:

class MyClass: public CListCtrl
{
...
protected:
CBrush m_brush;
...
}

MyClass::MyClass()
: m_brush( RGB(255, 255, 220) )
{
...
}

void MyClass::DrawItem(LPDRAWITEMSTRUCT dis) {
CDC dc;
dc.Attach(dis->hDC);
CRect rc = dis->rcItem;
dc.FillRect(&rc, &m_brush);
dc.Detach();
}

если же Вам потребуется реинициализировать кисть

void MyClass::DrawItem(LPDRAWITEMSTRUCT dis) {
CDC dc;
dc.Attach(dis->hDC);
CRect rc = dis->rcItem;

m_brush.DeleteObject();
m_brush.CreateSolidBrush( RGB(новые значения) );

dc.FillRect(&rc, &m_brush);
dc.Detach();
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.