Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.12.22;
Скачать: [xml.tar.bz2];

Вниз

ListView OndrawItem проблемы с рисованием   Найти похожие ветки 

 
Вова   (2013-03-04 16:49) [0]

Нужно сделать так, чтобы в ListView были папки и элементы. При этом папка может быть открытой или закрытой. Если папка открыта, то строку нужно закрасить в другой цвет. Что я собственно и пытался сделать вот этим кодом:

Но есть 2 проблемы: когда рисование идет по дефолту (т.е. без моего кода), то выбранная строка обрисовывается прозрачной голубой рамкой со скругленными краями - возможно ли ее как то самому нарисовать или вернуть стандартную?

Вторая проблема и главная  заключается в том, что если идет несколько открытых папок подряд, т.е. в первой строке открытая папка, во второй строке папка которая находится в в первой папке, которая указана в первой строке, и она тоже открыта, то вот в этом случае должны закрашиваться обе папки, а у меня почему то закрашивается только та на которой я щелкнул мышкой (т.е. последняя, она была закрыта, я на ней щелкаю 2 раза она открывается и закрашивается, а первая становится незакрашенной, хотя иконка на ней правильная, соответствующая открытой)

Ну и в нагрузку, как разлиновать ListView т.е. чтобы каждая строка была в рамке.


procedure TTv.ListView1DrawItem(Sender: TCustomListView; Item: TListItem;
 Rect: TRect; State: TOwnerDrawState);
var
 xColor: TColor;
 xRect: TRect;
 xBitmap: TBitmap;
 i: integer;
 gi: TGroupItem;
begin
 if ((TObject(Item.Data) is (TGroupItem))) then
 begin
   gi := TGroupItem(Item.Data);
   if gi.Expanded then
   begin
     xColor                        := clGradientInactiveCaption;
     xRect                         := Item.DisplayRect(drLabel);
     xRect.Left                    := xRect.Left;
     Sender.Canvas.Brush.Color     := xColor;
     Sender.Canvas.FillRect(xRect);
   end
   else
   begin
     xRect                     := Item.DisplayRect(drLabel);
     xRect.Left                := xRect.Left;
     Sender.Canvas.Brush.Color := clBtnFace;

     if odSelected  in State then
        Sender.Canvas.Brush.Color := clblue;
     // else
     // Sender.Canvas.Brush.Color := Colors[Item.Index mod 2];
     Sender.Canvas.FillRect(xRect);

   end;

   
   Sender.Canvas.Font.Color := clBlack;

   for i := 1 to TListView(Sender).Columns.Count - 1 do
   begin
     xRect.Left := xRect.Right;
     xRect.Right := xRect.Left + TListView(Sender).Columns.Items[i].Width - 1;
     Sender.Canvas.FillRect(xRect);
     if i <> 2 then
       Sender.Canvas.TextRect(xRect, xRect.Left + 3, xRect.Top + 2,
         Item.SubItems[i - 1])
     else
       Sender.Canvas.TextRect(xRect, xRect.Left + 3, xRect.Top + 2,
         Item.caption);
   end;

   if TListView(Sender).SmallImages = nil then
     exit;

   xRect := Item.DisplayRect(drIcon);
   xRect.Left := xRect.Left -10;

   if gi.Expanded then
      Sender.Canvas.Brush.Color := clGradientInactiveCaption
   else
      Sender.Canvas.Brush.Color := clBtnFace;

   Sender.Canvas.FillRect(xRect);

   if Item.ImageIndex = -1 then
     exit;

   xBitmap := TBitmap.Create;
   ImageList1.GetBitmap(Item.ImageIndex, xBitmap);
   Sender.Canvas.BrushCopy(Item.DisplayRect(drIcon), xBitmap,
     Bounds(0, 0, xBitmap.Width, xBitmap.Height), xBitmap.TransparentColor);
   xBitmap.Free;

 end;
end;



 
Вова   (2013-03-04 18:15) [1]

1


 
Вова   (2013-03-04 18:18) [2]

мда....а еще как форум починить, я ничего не вижу, но ответ могу написать )))

Сетка включается свойством GridLines, но тогда возникает вопрос, как изменить цвет линий. А если рисовать  ее DrawFocusRect, то получается какая то ерунда, т.к. квадраты друг на друга не накладываются )


 
Вова   (2013-03-04 19:49) [3]

procedure TTv.ListView1CustomDrawItem(Sender: TCustomListView; Item: TListItem;
 State: TCustomDrawState; var DefaultDraw: Boolean);
begin
 if Item.Index = 1 then
   Sender.Canvas.Brush.Color := clGradientInactiveCaption
 else
   Sender.Canvas.Brush.Color := clWindow;
end;


и даже так рисуется какая то чушь ( красятся элементы даж с картинками с другим индексом. Красится в лучшем случае последний активированный, а то и вообще тот что идет сразу за ним, и имеет другой индекс. Неговоря уж о том, что так не закрашивается иконка. А если тут сделать FillRect то начнется тихий ужас вообще.

вообщем рукожопный какой то компонент. Хнык.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2013.12.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.002 c
15-1372913017
БарЛог
2013-07-04 08:43
2013.12.22
"Обернуть" консольное приложение своим


15-1372969802
Юрий
2013-07-05 00:30
2013.12.22
С днем рождения ! 5 июля 2013 пятница


15-1372449106
TUser
2013-06-28 23:51
2013.12.22
Мыльница


15-1372770167
Jeer
2013-07-02 17:02
2013.12.22
Вело-отдых


15-1372537802
Юрий
2013-06-30 00:30
2013.12.22
С днем рождения ! 30 июня 2013 воскресенье





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский