CListCtrl, перерисовка
От: pe Россия  
Дата: 10.01.05 14:32
Оценка:
Переопределяю функцию DrawItem в CListCtrl. При перерисовке эта функция вызывается для каждой строки, но перерисовывается при этом только первая строка. Остальные перерисовываются только после кликанья по ним мышой. Как решить эту проблему?
Re: CListCtrl, перерисовка
От: visual_wind  
Дата: 10.01.05 14:52
Оценка:
Здравствуйте, pe, Вы писали:

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


Посмотрите, как Вы используете поле itemID структуры DRAWITEMSTRUCT, это индекс строки.
А лучше, покажите всю функцию.
Re[2]: CListCtrl, перерисовка
От: pe Россия  
Дата: 10.01.05 15:51
Оценка:
Здравствуйте, visual_wind, Вы писали:

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


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


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

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

Функция:
void MyClass::DrawItem(LPDRAWITEMSTRUCT dis) {
CDC dc;
dc.Attach(dis->hDC);
CRect rc = dis->rcItem;
dc.FillRect(&rc, &CBrush(RGB(255, 255, 220)));
}

Причем она вызывается для каждой строки и в rc координаты правильные, т.е. соответствующие строке.
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...
Пока на собственное сообщение не было ответов, его можно удалить.