Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.12.22;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.005 c
15-1373039110
^-k-^
2013-07-05 19:45
2013.12.22
ajax


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


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


15-1372797002
Юрий
2013-07-03 00:30
2013.12.22
С днем рождения ! 3 июля 2013 среда


4-1268421869
Жэня
2010-03-12 22:24
2013.12.22
Проблема получением сообщения WM_COPYDATA, Проблема с аглоритмом