Форум: "Начинающим";
Текущий архив: 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