Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.033 c
4-1076074289
able
2004-02-06 16:31
2004.04.18
Сокеты на WinAPI


11-1059748317
JanvVlad
2003-08-01 18:31
2004.04.18
Моргание ListView


3-1079947979
Анонимщик
2004-03-22 12:32
2004.04.18
Delphi6, Interbase


1-1080892540
Серж
2004-04-02 11:55
2004.04.18
Макроподстановка кода(!) в Delphi?


7-1077123849
juiceman
2004-02-18 20:04
2004.04.18
сервис





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