Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как изменить цвет шрифта ListVieW выделенного item 
:(
    Опции темы
samtron
Дата 5.8.2009, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 11.4.2009

Репутация: нет
Всего: нет



Подскажите пожалуйста, каким образом можно менять аттрибуты шрифта выделенных items в ListView? 
Прочел здесь( http://doc-for-prog.narod.ru/topics/messag...omdraw_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.

Это сообщение отредактировал(а) samtron - 5.8.2009, 13:10
PM MAIL   Вверх
GremlinProg
Дата 5.8.2009, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(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,
там принципы те же, смотри описание флагов структуры DRAWITEMSTRUST

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


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
samtron
Дата 6.8.2009, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 11.4.2009

Репутация: нет
Всего: нет



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 );
                                } 
     
                            }

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0471 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.