BS>Привет всем! BS>Есть стандартный ListView со стилями LVS_EX_GRIDLINES и LVS_REPORT (эмуляция Grid-a). Хочется сделать "зебру" — чередующиеся белые и серые полосы. Или выделять некоторые строки иным цветом (красным, если это что-то критическое), в зависимости от значения строки.
BS>Можно ли это сделать средствами обычного ListView?
#define CDDS_SUBITEMPREPAINT (CDDS_ITEM | CDDS_SUBITEM | CDDS_PREPAINT)
void CXxxxxxx::OnMyListCustomDraw( NMHDR * pNMHDR, LRESULT * pResult )
{
NMLVCUSTOMDRAW * pLVCustomDraw = ( NMLVCUSTOMDRAW* ) pNMHDR;
*pResult = CDRF_DODEFAULT;
switch ( pLVCustomDraw->nmcd.dwDrawStage )
{
case CDDS_PREPAINT:
// при начале прорисовки листа указываем, что нам нужны нотификации на прорисовку каждой строки
*pResult |= CDRF_NOTIFYITEMDRAW ;
break;
case CDDS_ITEMPREPAINT:
// если нужно красить строки целиком, то можно остановиться здесь
// установить цвета текста и фона и выставить *pResult |= CDRF_NEWFONT;, НО, нам
// item-ов маловато, хотим прорисовывать разным цветом subitem-ы, поэтому
*pResult |= CDRF_NOTIFYSUBITEMDRAW;
break;
case CDDS_SUBITEMPREPAINT:
// а вот и ониswitch ( pLVCustomDraw->iSubItem ) // каждую колоночку отдельно
{
case IDENT_COL:
if ( чего-то там )
{
pLVCustomDraw->clrTextBk = GetSysColor( COLOR_WINDOW );
pLVCustomDraw->clrText = GetSysColor( COLOR_WINDOWTEXT );
}
break;
case TIME_COL:
if ( чего-то там )
{
pLVCustomDraw->clrText = m_clrWarning;
pLVCustomDraw->clrTextBk = GetSysColor( COLOR_WINDOW );
}
else
{
pLVCustomDraw->clrText = m_clrNoWarning;
pLVCustomDraw->clrTextBk = GetSysColor( COLOR_WINDOW );
}
break;
default:
pLVCustomDraw->clrTextBk = GetSysColor( COLOR_WINDOW );
pLVCustomDraw->clrText = GetSysColor( COLOR_WINDOWTEXT );
break;
}
*pResult |= CDRF_NEWFONT;
break;
}
}
Привет всем!
Есть стандартный ListView со стилями LVS_EX_GRIDLINES и LVS_REPORT (эмуляция Grid-a). Хочется сделать "зебру" — чередующиеся белые и серые полосы. Или выделять некоторые строки иным цветом (красным, если это что-то критическое), в зависимости от значения строки.
Можно ли это сделать средствами обычного ListView?
ICQ 153965498
Re: Можно ли по-своему отрисовывать строки ListView?
Здравствуйте BaSergey, Вы писали:
BS>Привет всем! BS>Есть стандартный ListView со стилями LVS_EX_GRIDLINES и LVS_REPORT (эмуляция Grid-a). Хочется сделать "зебру" — чередующиеся белые и серые полосы. Или выделять некоторые строки иным цветом (красным, если это что-то критическое), в зависимости от значения строки.
BS>Можно ли это сделать средствами обычного ListView?
Читай про NM_CUSTOMDRAW.
Успехов,
Виталий.
Re: Можно ли по-своему отрисовывать строки ListView?
Здравствуйте BaSergey, Вы писали:
BS>Есть стандартный ListView со стилями LVS_EX_GRIDLINES и LVS_REPORT (эмуляция Grid-a). Хочется сделать "зебру" — чередующиеся белые и серые полосы. Или выделять некоторые строки иным цветом (красным, если это что-то критическое), в зависимости от значения строки.
BS>Можно ли это сделать средствами обычного ListView?
Если под "средствами обычного ListView" понимать самостоятельную обработку сообщения NM_CUSTOMDRAW, то можно.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: Можно ли по-своему отрисовывать строки ListView?
Здравствуйте BaSergey, Вы писали:
BS>Привет всем! BS>Есть стандартный ListView со стилями LVS_EX_GRIDLINES и LVS_REPORT (эмуляция Grid-a). Хочется сделать "зебру" — чередующиеся белые и серые полосы. Или выделять некоторые строки иным цветом (красным, если это что-то критическое), в зависимости от значения строки.
BS>Можно ли это сделать средствами обычного ListView?
Можно. Именно для таких задач и существует CustomDraw,
Обрабатывай в ParenWindow WM_NOTIFY с нотификацией NM_CUSTOMDRAW (о деталях смотри MSDN) тебе нужно CDDS_PREPAINT и CDDS_ITEMPREPAINT, видимо.
удачи!
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re: Можно ли по-своему отрисовывать строки ListView?