Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Как изменить цвет шрифта ListVieW выделенного item


Автор: samtron 5.8.2009, 12:57
Подскажите пожалуйста, каким образом можно менять аттрибуты шрифта выделенных items в ListView? 
Прочел здесь( http://doc-for-prog.narod.ru/topics/messages/nm_customdraw_use.html ) о том, что сообщение NM_CUSTOMDRAW не изменит атрибуты шрифта выделенного item 
Цитата

В своих приложениях вы можете использовать custom draw для изменения шрифта items. Для этого необходимо просто выбрать HFONT с нужными параметрами в контекст устройства, указанный а поле hdc структуры NMCUSTOMDRAW, которая передается в качестве параметра сообщения. Будте внимательны, если вы меняете шрифт, на отличный от шрифта по умолчанию, убедитесь, что в возвращаемое значение вы включили флаг CDRF_NEWFONT. Шрифт, который вы выбираете, будет использоваться для отображения item в обычном состоянии, когда он не выделен. Технология custom draw не позволяет менять аттрибуты шрифта выделенных items.


Я хочу сделать, чтобы шрифт выделенного itema был НЕ БЕЛЫЙ, коим он является стандартно, а оставался того цвета, который он имеет когда он НЕ ВЫДЕЛЕН. 
Вот мой код раскраски шрифта в listview - строки раскрашиваются в красный, зеленый и черные цвета, в зависимости от данных, хранимых в буфере(buffColorItem):
Код

    if( ((LPNMHDR)lParam) -> code == NM_CUSTOMDRAW )
    {

//Шрифт для listview
                    LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam;

                    switch( lplvcd -> nmcd.dwDrawStage ) 
                    {
                        case CDDS_PREPAINT :
                            return CDRF_NOTIFYITEMDRAW;

                        case CDDS_ITEMPREPAINT:    
                        {                                
                            TEXTMETRIC tm;
                            GetTextMetrics(lplvcd->nmcd.hdc, &tm);

                            LOGFONT font;
                                                        
                            font.lfHeight         = FontSize;
                            font.lfWidth          = 0;
                            font.lfEscapement     = 0;
                            font.lfOrientation    = 0;
                            font.lfWeight         = FW_NORMAL;
                            font.lfItalic         = tm.tmItalic;
                            font.lfUnderline      = tm.tmUnderlined;
                            font.lfStrikeOut      = tm.tmStruckOut;
                            font.lfCharSet        = tm.tmCharSet;
                            font.lfOutPrecision   = PROOF_QUALITY;
                            font.lfClipPrecision  = OUT_DEFAULT_PRECIS;
                            font.lfQuality        = PROOF_QUALITY;
                            font.lfPitchAndFamily = tm.tmPitchAndFamily;
                            strcpy(font.lfFaceName, "Times New Roman");

                            hFontViewBold = CreateFontIndirect(&font);
                            SelectObject( lplvcd->nmcd.hdc, hFontViewBold );

                            int color;
//Выбираю цвет шрифта исходя из данных моего буфера(buffColorItem), содержащего информацию о цвете
                            if( ColorFlag == 1 )
                                color = atoi(buffColorItem1[((int)lplvcd->nmcd.dwItemSpec)]);
                            
                            if( ColorFlag == 2 )
                                color = atoi(buffColorItem2[((int)lplvcd->nmcd.dwItemSpec)]);
                            
                            if( ColorFlag == 3 )
                                color = atoi(buffColorItem3[((int)lplvcd->nmcd.dwItemSpec)]);
                            
                            if( (color == 30) || (color == 31) ||  (color == 130) || (color == 131))
                            {
                                lplvcd->clrText   = RGB(255,0,0);
                                return CDRF_NEWFONT;                    
                            }
                            else if( (color == 20) || (color == 21) ||  (color == 120) || (color == 121) )
                            {
                                lplvcd->clrText   = RGB(0,255,0); 
                                return CDRF_NEWFONT;
                            }
                            else 
                            {
                                lplvcd->clrText   = RGB(0,0,0); 
                                return CDRF_NEWFONT;
                            }
                        }
                            break;
                    }
                    return CDRF_DODEFAULT;
            
    }    

Плюс ко всему хочу изменить цвет выделения item.

Автор: GremlinProg 5.8.2009, 18:07
Цитата(samtron @  5.8.2009,  14:57 Найти цитируемый пост)
каким образом можно менять аттрибуты шрифта выделенных items в ListView? 

Код

...
if( lplvcd->nmcd.uItemState &  CDIS_FOCUS ){
    //  меняй атрибуты для записи в фокусе
}
if( lplvcd->nmcd.uItemState & CDIS_SELECTED ){
    //  меняй атрибуты для выделенной записи
}
...
return CDRF_NEWFONT;


итемы ListView раскрашивать можно еще через WM_DRAWITEM с флагом LVS_OWNERDRAWFIXED,
там принципы те же, смотри описание флагов структуры http://msdn.microsoft.com/en-us/library/bb775802(VS.85).aspx

смотри, что удобне

Автор: samtron 6.8.2009, 12:09
Cпасибо GremlinProg, Вы указали мне направление в котором искать, вот мое решение, работает так как я и хотел:

Код

    if( ((LPNMHDR)lParam) -> code == NM_CUSTOMDRAW )
    {

//Шрифт для listview
                    LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam;

                    switch( lplvcd -> nmcd.dwDrawStage ) 
                    {
                        case CDDS_PREPAINT :
                            return CDRF_NOTIFYITEMDRAW;

                        case CDDS_ITEMPREPAINT:    
                                
                            TEXTMETRIC tm;
                            GetTextMetrics(lplvcd->nmcd.hdc, &tm);

                            LOGFONT font;
                                                        
                            font.lfHeight         = FontSize;
                            font.lfWidth          = 0;
                            font.lfEscapement     = 0;
                            font.lfOrientation    = 0;
                            font.lfWeight         = FW_NORMAL;
                            font.lfItalic         = tm.tmItalic;
                            font.lfUnderline      = tm.tmUnderlined;
                            font.lfStrikeOut      = tm.tmStruckOut;
                            font.lfCharSet        = tm.tmCharSet;
                            font.lfOutPrecision   = PROOF_QUALITY;
                            font.lfClipPrecision  = OUT_DEFAULT_PRECIS;
                            font.lfQuality        = PROOF_QUALITY;
                            font.lfPitchAndFamily = tm.tmPitchAndFamily;
                            strcpy(font.lfFaceName, "Times New Roman");

                            hFontViewBold = CreateFontIndirect(&font);
                            SelectObject( lplvcd->nmcd.hdc, hFontViewBold );

                            int color;

                            if( ColorFlag == 1 )
                                color = atoi(buffColorItem1[((int)lplvcd->nmcd.dwItemSpec)]);
                            
                            if( ColorFlag == 2 )
                                color = atoi(buffColorItem2[((int)lplvcd->nmcd.dwItemSpec)]);
                            
                            if( ColorFlag == 3 )
                                color = atoi(buffColorItem3[((int)lplvcd->nmcd.dwItemSpec)]);
                            
                            if( (color == 30) || (color == 31) ||  (color == 130) || (color == 131))
                            {
                                lplvcd->clrText   = RGB(255,0,0);                                                    
                            }
                            else if( (color == 20) || (color == 21) ||  (color == 120) || (color == 121) )
                            {
                                lplvcd->clrText   = RGB(0,255,0);                                
                            }
                            else 
                            {
                                lplvcd->clrText   = RGB(0,0,0);                                
                            }        
               
                            lplvcd->nmcd.uItemState &= ~CDIS_SELECTED; // kill sys sel
                            if (ListView_GetItemState(lplvcd->nmcd.hdr.hwndFrom,(int)lplvcd->nmcd.dwItemSpec,LVIS_SELECTED))
                            {
//В зависимости от color крашу в разный цвет шрифт, color выбирается из моего массива buffColorItem 
                                if( (color == 30) || (color == 31) ||  (color == 130) || (color == 131))
                                {    
                                    lplvcd->clrText   = RGB( 255, 0, 0 );
                                    lplvcd->clrTextBk = RGB( 15, 41, 110 );                                                        
                                }
                                else if( (color == 20) || (color == 21) ||  (color == 120) || (color == 121) )
                                {    
                                    lplvcd->clrText   = RGB( 0, 255, 0 );
                                    lplvcd->clrTextBk = RGB( 15, 41, 110 );
                                }
                                else 
                                {    
                                    lplvcd->clrText   = RGB( 255, 255, 255 );
                                    lplvcd->clrTextBk = RGB( 15, 41, 110 );
                                } 
     
                            }
                        return CDRF_NEWFONT;    

                    }
                    return CDRF_DODEFAULT;
}


А вот собственно и решение:
Код

                            lplvcd->nmcd.uItemState &= ~CDIS_SELECTED; // kill sys sel
                            if (ListView_GetItemState(lplvcd->nmcd.hdr.hwndFrom,(int)lplvcd->nmcd.dwItemSpec,LVIS_SELECTED))
                            {
//В зависимости от color крашу в разный цвет шрифт, color выбирается из моего массива buffColorItem 
                                if( (color == 30) || (color == 31) ||  (color == 130) || (color == 131))
                                {    
                                    lplvcd->clrText   = RGB( 255, 0, 0 );
                                    lplvcd->clrTextBk = RGB( 15, 41, 110 );                                                        
                                }
                                else if( (color == 20) || (color == 21) ||  (color == 120) || (color == 121) )
                                {    
                                    lplvcd->clrText   = RGB( 0, 255, 0 );
                                    lplvcd->clrTextBk = RGB( 15, 41, 110 );
                                }
                                else 
                                {    
                                    lplvcd->clrText   = RGB( 255, 255, 255 );
                                    lplvcd->clrTextBk = RGB( 15, 41, 110 );
                                } 
     
                            }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)