Можно ли по-своему отрисовывать строки ListView?
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 16.10.02 09:34
Оценка: 51 (4)
#Имя: FAQ.listview.customdraw
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?
От: BaSergey Россия  
Дата: 16.10.02 09:19
Оценка:
Привет всем!
Есть стандартный ListView со стилями LVS_EX_GRIDLINES и LVS_REPORT (эмуляция Grid-a). Хочется сделать "зебру" — чередующиеся белые и серые полосы. Или выделять некоторые строки иным цветом (красным, если это что-то критическое), в зависимости от значения строки.

Можно ли это сделать средствами обычного ListView?
ICQ 153965498
Re: Можно ли по-своему отрисовывать строки ListView?
От: retalik www.airbandits.com/
Дата: 16.10.02 09:26
Оценка:
Здравствуйте BaSergey, Вы писали:

BS>Привет всем!

BS>Есть стандартный ListView со стилями LVS_EX_GRIDLINES и LVS_REPORT (эмуляция Grid-a). Хочется сделать "зебру" — чередующиеся белые и серые полосы. Или выделять некоторые строки иным цветом (красным, если это что-то критическое), в зависимости от значения строки.

BS>Можно ли это сделать средствами обычного ListView?

Читай про NM_CUSTOMDRAW.
Успехов,
Виталий.
Re: Можно ли по-своему отрисовывать строки ListView?
От: Sergey Россия  
Дата: 16.10.02 09:34
Оценка:
Здравствуйте BaSergey, Вы писали:

BS>Есть стандартный ListView со стилями LVS_EX_GRIDLINES и LVS_REPORT (эмуляция Grid-a). Хочется сделать "зебру" — чередующиеся белые и серые полосы. Или выделять некоторые строки иным цветом (красным, если это что-то критическое), в зависимости от значения строки.


BS>Можно ли это сделать средствами обычного ListView?


Если под "средствами обычного ListView" понимать самостоятельную обработку сообщения NM_CUSTOMDRAW, то можно.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: Можно ли по-своему отрисовывать строки ListView?
От: Hacker_Delphi Россия  
Дата: 16.10.02 09:35
Оценка:
Здравствуйте 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?
От: lpn_com  
Дата: 30.08.07 13:33
Оценка:
OE> switch ( pLVCustomDraw->iSubItem ) // каждую колоночку отдельно
OE> {

подскажите как номер строки узнать, а не только саб-итема ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.