Главная страница
    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.47 MB
Время: 0.002 c
15-1372932417
Empleado
2013-07-04 14:06
2013.12.22
Программист: берегись!


15-1371997140
Артём
2013-06-23 18:19
2013.12.22
Найдётся ли работа новичку?


15-1372669325
Дмитрий СС
2013-07-01 13:02
2013.12.22
Альтернатива Яндекс.Музыки.


2-1362069393
Win XP
2013-02-28 20:36
2013.12.22
Разрешение экрана


15-1373039110
^-k-^
2013-07-05 19:45
2013.12.22
ajax





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский