Форум: "Основная";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
ВнизОтрисовка background в строке List View Найти похожие ветки
← →
Yuri Btr © (2004-03-27 16:02) [0]Ув. мастера, есть проблема - мне нужно в ListView (стиль vsReport), отрисовывать свой background (в частности цвет и размер) для каждой строки, оставляя текст нетронутым.
Я пытался сделать так:
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
var
BackUpColor:TColor;
begin
BackUpColor:=(Sender as TListView).Canvas.Brush.Color;
(Sender as TListView).Canvas.Brush.Color:=clRed;
(Sender as TListView).Canvas.Rectangle(0,0,80,80);
(Sender as TListView).Canvas.Brush.Color:=BackUpColor;
DefaultDraw:=true;
end;
Но при прорисовке получается что текст скрывается моим background, хотя DefaultDraw:=true;
Ведь Help говорится что
...
Set DefaultDraw to false if you don"t want the control to paint the item’s text after the event handler exits. If DefaultDraw remains true, the list view adds the item’s text to the image on the canvas.
...
Подскажите плиз как мне нарисовать Rectangle или иную фигуру и заполнить её цветом не отрисовывая потом заново текст строки.
Заранее спасибо.
← →
DVM © (2004-03-27 17:59) [1]WM_ERASEBKGND не пробовал? Поможет.
← →
Yuri Btr © (2004-03-27 18:44) [2]TO DVM ©
Простите...
А как он может помочь в этом случае?
Мне нужно нарисовать на бэкграунде, чтобы не затереть текст.
В общем я не могу понять почему текст не отрисовывается после вызова CustomDrawItem, зачем тогда вообще DefaultDraw ???
← →
Yuri Btr © (2004-03-28 08:16) [3]Ну может кто нибудь сталкивался с подобной проблемой, подскажите пожалуйста...
← →
Yuri Btr © (2004-03-29 11:17) [4]Последняя попытка...
помогите кто может.
Очень хочется сделять чтото наподобие индикатора поргресса как в RegetDeluxe в каждой строке или на всю строку бэкгроундом.
← →
Семен Сорокин © (2004-03-29 11:44) [5]procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
(Sender as TListView).Canvas.Brush.Color:=clRed;
end;
← →
DVM © (2004-03-29 12:38) [6]
> Простите...
> А как он может помочь в этом случае?
> Мне нужно нарисовать на бэкграунде, чтобы не затереть текст.
Чтобы не затереть текст вот и надо рисовать ДО того как начнет отрисовываться конкретный итем. Сначала приходит сообщение WM_ERASEBKGND и рисует указанную часть фона. Если его обрабатывать самому, то зная координаты прямоугольника итема (а их можно узнать) можно отрисовать хоть черта лысого.
Можно и индикатор так засунуть туда (правда не знаю так ли правильно это делается) тогда чтобы обновить показания индикатора достаточно будет вызвать InvalidateRect для обновления той области где он расположен.
← →
Yuri Btr © (2004-03-29 12:58) [7]to Семен Сорокин ©
Я это уже делаю, в некоторых случаях.
за ответ спасибо.
to DVM ©
Всё, теперь понял...
буду пробовать, огромное спасибо за помощь
Вариант с готовым прогрессбаром интересен, но не хотелось бы отводить отдельную колонку для этого в LIstView - экономия места в моем случае знаете ли.
← →
Yuri Btr © (2004-03-29 15:27) [8]Странно...
Создал компонент наследник TListView
в нём перехватил WM_ERASEBKGND, рисую в обработчике а оно затирается текстом и фоном текста :-(
Остальная область прорисовывается замечательно.
Получается что фон Items прорисовывается после WM_ERASEBKGND и как же его перекрыть???
Вот мой код
type
TYuriListView = class(TListView)
private
{ Private declarations }
procedure WMERASEBKGND (var Msg: TWMERASEBKGND); message WM_ERASEBKGND;
....
implementation
....
procedure TYuriListView.WMERASEBKGND(var Msg: TWMERASEBKGND);
Var
ItemCanvas :TCanvas;
begin
try
ItemCanvas:=TCanvas.Create;
ItemCanvas.Handle:=MSG.DC;
ItemCanvas.Brush.Color:=clRed;
ItemCanvas.Rectangle(Rect(0,0,Width,Height));
finally
ItemCanvas.Free;
Msg.Result:=1;
end;
end;
← →
DVM © (2004-03-29 21:09) [9]
> в нём перехватил WM_ERASEBKGND, рисую в обработчике а оно
> затирается текстом и фоном текста :-(
Сделай фон текста прозрачным.
← →
Yuri Btr © (2004-03-30 11:42) [10]to DVM ©
Но как фон текста сделать прозрачным?
Я могу нарисовать на фоне ListView но затем, когда рисуются Items мне недоступны ни текст ни фон под ними.
Я так понимаю что после WM_ERASEBKGND рисуются Items вместе с фоном (именно когда Msg.Result<>0) - так вот именно тогда нужно сделать фон Items прозрачным - но где именно поместить этот код?
Пробую в AdvancedCustomDrawItem
...
YuriListView1.Canvas.Brush.Style:=bsClear;
...
Фон не затирается...
← →
DVM © (2004-03-30 17:53) [11]ListView_SetTextBkColor(hListView, CLR_NONE);
← →
Yuri Btr © (2004-03-30 18:44) [12]Спасибочки.
Вроде всё заработало...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.076 c