Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > TListView событие OnCustomDrawSubItem


Автор: Нитонисе 22.6.2012, 11:41
Имеется список 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'а) и вертикальные границы между всеми остальными субитемами (полоски)

http://www.radikal.ru

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

http://www.radikal.ru

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

P.S. ОС - Win7, Builder XE.

Автор: Нитонисе 22.6.2012, 12:21
Частично разобрался сам
Код

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 
Но вот осталась проблема - при выделении итема или при наведении на него мыши текст закрашивается черным, как на втором скрине первого сообщения :(

Автор: Нитонисе 22.6.2012, 14:17
Решил вопрос по другому.
Ставлю свойство 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);
        }
    }
}


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

http://www.radikal.ru

Впринципе красиво smile На месте красного прямоугольника по идее будет рисоваться нужная мне картинка.

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