Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TListView событие OnCustomDrawSubItem 
:(
    Опции темы
Нитонисе
Дата 22.6.2012, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Имеется список TListView в стиле vsReport. Задача - в колонках номер 2 (SubItem = 1) рисовать заданную картинку на канве. Вообще говоря хочется понять как рисовать в любых SubItem'ах.
При этом все прочие SubItem'ы должны рисоваться штатно. 

Попытался использовать событие OnCustomDrawSubitem.
Код

if (SubItem == 1)
    {
        DefaultDraw = false;
        Sender->Canvas->Brush->Color = clRed;
        TRect r = Item->DisplayRect(drBounds);
        Sender->Canvas->FillRect(r);
    }

В результате закрашивается красным первая колонка (Caption Item'а) и вертикальные границы между всеми остальными субитемами (полоски)

user posted image

А если навести курсор на строку, то она становится вот такой

user posted image

Подскажите как правильно решить мою задачу, а еще лучше если бы дали работающий пример кастомной прорисовки субитема smile

P.S. ОС - Win7, Builder XE.
PM MAIL   Вверх
Нитонисе
Дата 22.6.2012, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Частично разобрался сам
Код

if (SubItem == 1)
{
    Sender->Canvas->Brush->Color = clRed;
    TRect r = Item->DisplayRect(drBounds);
    r.Left += Sender->Column[0]->Width;
    r.Right = r.Left + Sender->Column[1]->Width;
    Sender->Canvas->FillRect(r);
}
else
{        
    Sender->Canvas->Brush->Color = clWhite;
}

Теперь закрашивается красным только вторая колонка, а все остальные субитемы рисуются штатно. Правда без кода в блоке else почему шрифт в субитемах жирный (как в скринах первого сообщения), а вот с блоком else - нормальный. Не пойму почему  smile 
Но вот осталась проблема - при выделении итема или при наведении на него мыши текст закрашивается черным, как на втором скрине первого сообщения :(
PM MAIL   Вверх
Нитонисе
Дата 22.6.2012, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Решил вопрос по другому.
Ставлю свойство ListView->OwnerDraw = true. Использую событие OnDrawItem, где полностью отрисовываю итем как мне надо:

Код

void __fastcall TForm1::ListView1DrawItem(TCustomListView *Sender, TListItem *Item, TRect &Rect, TOwnerDrawState State)
{
    Rect.Bottom--;
    Rect.Left++;
    if (Item->Selected)
    {
        Sender->Canvas->Pen->Color = RGB(4,88,191);
        Sender->Canvas->Brush->Color = RGB(190,238,248);
    }
    else
    {
        Sender->Canvas->Pen->Color = clWhite;
        Sender->Canvas->Brush->Color = clWhite;
    }
    Sender->Canvas->RoundRect(Rect.Left,Rect.Top,Rect.Right,Rect.Bottom,4,4);
    Rect.Right = Rect.Left + Sender->Column[0]->Width;
    DrawText(Sender->Canvas->Handle,
                     Item->Caption.t_str(),
                     Item->Caption.Length(),
                     &Rect,
                     DT_CENTER | DT_VCENTER | DT_SINGLELINE);
    for (int i=0; i<Item->SubItems->Count; i++)
    {

        Rect.Left = Rect.Right;
        Rect.Right += Sender->Column[i+1]->Width;
        if (i == 0)
        {
            Sender->Canvas->Brush->Color = clRed;
            Sender->Canvas->FillRect(Rect);
        }
        else
        {
            DrawText(Sender->Canvas->Handle,
                             Item->SubItems->Strings[i].t_str(),
                             Item->SubItems->Strings[i].Length(),
                             &Rect,
                             DT_CENTER | DT_VCENTER | DT_SINGLELINE);
        }
    }
}


Получается такой эффект:

user posted image

Впринципе красиво smile На месте красного прямоугольника по идее будет рисоваться нужная мне картинка.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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