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

Вниз

Неясности с отрисовкой SubItem у ListView   Найти похожие ветки 

 
Korneley ©   (2007-09-11 14:55) [0]

Рисуя на OnCustomDrawSubItem столкнулся со следующим: не могу изменить свойства Sender.Canvas.Font, т.е. в коде-то я меняю, но рисуется все равно тем Font, что задан в свойствах ListView. DefaultDraw выставляю в false, у ListView: ViewStyle = vsReport, RowSelect = true.
 Пользую BDS2006, но в D7 тоже самое. Может кто знает как это побороть? Предложение не трогать DefaultDraw не канает: Font-то я поменяю, а вот Pen проигнорируется  напрочь :( Смотрел на RSDN, там те же советы: менять Font.Style, дык я так и делал... Короче помогите, кто чем может, пожалуйста :)


 
DVM ©   (2007-09-11 15:01) [1]


> Korneley ©   (11.09.07 14:55)  

Ты код обработчика OnCustomDrawSubItem то бы показал.


 
Korneley ©   (2007-09-11 15:15) [2]

Ну, к примеру:
procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
 Item: TListItem; SubItem: Integer; State: TCustomDrawState;
 var DefaultDraw: Boolean);
var i, tw : integer;
   r : TRect;
   s : string;
begin
 with TListView(Sender).Canvas do begin
   if SubItem in [1, 2] then begin
     s := Item.SubItems[SubItem - 1];
     tw := TextWidth(s);
     r := Item.DisplayRect(drLabel);
     r.Left := 0;
     for i := 0 to subitem - 1 do inc(r.Left, TListView(Sender).Columns[i].Width);
     r.Right:= r.Left + TListView(Sender).Columns[SubItem].Width - 1;
     case SubItem of
     1:Pen.Color := clLime;
     2:Pen.Color := clRed;
     end;
     if (cdsFocused in State)
     then Brush.Color := Pen.Color;
     inc(r.Left); inc(r.Top); dec(r.Right); dec(r.Bottom);
     Rectangle(r);
     Font.Style := Font.Style + [fsBold];
     Font.Color := clBlue;
     inc(r.Left); inc(r.Top); dec(r.Right); dec(r.Bottom);
     TextRect(r, r.Left, r.Top - 2, s);
     DefaultDraw := false;
   end;
 end;
end;

ListView, как можно догадаться из трех колонок (напомню, стиль vsReport)


 
DVM ©   (2007-09-11 16:05) [3]


> Korneley ©

а почему бы тебе самому не выводить надписи своим шрифтом ?


 
korneley ©   (2007-09-11 16:22) [4]

Чего-то я туплю... Вообще (как я считал) если изменить свойства у Canvas.Font, то последующий Canvas.TextRect/TextOut должен выводить текст уже с этими самыми свойствами фонта. И что значит: "_своим_ шрифтом"? Ты предлагаешь самому создать экземпляр TFont и потом его "пристегивать" к Canvas от ListView? Так и до DC доберемся... :)  Или я все же тупой...:( Поясни, пожалуйста, свою реплику, а то я не догоняю, что именно ты имел в виду.


 
DVM ©   (2007-09-11 16:27) [5]


> Поясни, пожалуйста, свою реплику, а то я не догоняю, что
> именно ты имел в виду

Я имел ввиду, что выводи надпись сам Canvas.TextOut() следом за назначением шрифта.


 
korneley ©   (2007-09-11 16:37) [6]

Дык, я так и делаю!!! cм. with TListView(Sender).Canvas do begin
в начале тела метода. Иначе как бы я вообще рисовал... Пробовал и без with , результат тот же, что впрочем, не удивляет (не сам результат, а повторяемость опыта). Причем добавлю, что при  DefaultDraw=true, шрифт меняется, но при этом я могу рулить только Brush.Color, да и то только если тема не Selected


 
DVM ©   (2007-09-11 16:44) [7]


> Дык, я так и делаю

Я не увидел TextRec

Я бы вообще посоветовал выставить ListView стиль OwnerDraw := true и выполнять отрисовку всего в OnDrawItem. Во-первых, это не глючит никогда, во-воторых, это не будет глючить в Viste-е.


 
korneley ©   (2007-09-11 17:04) [8]


> Я бы вообще посоветовал выставить ListView стиль OwnerDraw
> := true

Это-то понятно... Но рисовать придется чуть больше, да и вопрос: "почему не работает?" так и останется... Спасибо за участие, вероятно так и сделаю. "Хочешь красиво - рисуй ВСЕ сам" :)


 
DVM ©   (2007-09-11 17:09) [9]


> да и вопрос: "почему не работает?" так и останется

У меня были такие же проблемы, похоже в ТListView есть ошибки в реализации методов OnCustomDrawSubItem() он OnAdvancedCustomDrawSubItem(). Кое как поборол, но в Vista все вылезло опять.

Перенес все OnDrawItem и забыл.


 
korneley ©   (2007-09-11 17:18) [10]

Да, понятно. Еще раз спасибо, просто сначала надо было сделать быстро, теперь сделаем правильно...


 
{RASkov} ©   (2007-09-11 17:31) [11]

> [7] DVM ©   (11.09.07 16:44)
> глючить в Viste-е.

который раз уже это слышу....
Вот один товарищ, я ему дал программку именно с OnCustomDrawSubItem, OnAdvancedCustomDrawSubItem и OwnerDraw := false а у него виста, должен мне прислать скрины.... вот все жду, а он не шлет.... но говорит, что все рисуется нормально....
Но дело в том, что я не видел как моя программа выглядит в висте, а он не видел как она выглядит под XP :)
В чем там хоть косяк-то? )


 
DVM ©   (2007-09-11 17:33) [12]


> .... но говорит, что все рисуется нормально....

Там иногда получается. что как не крути, а поверх нарисованного тобой система рисует еще свое что-то при включенных темах.

Домой дойду скрин выложу и код его создающий, если не забуду.


 
{RASkov} ©   (2007-09-11 20:07) [13]

> [12] DVM ©   (11.09.07 17:33)
> Домой дойду скрин выложу и код его создающий, если не забуду.

Ок.



Страницы: 1 вся ветка

Текущий архив: 2007.10.07;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.022 c
15-1189357149
anton773
2007-09-09 20:59
2007.10.07
почему дата отображается полностью


6-1170949405
AllDontFire
2007-02-08 18:43
2007.10.07
Как реализовать 3х уровневое приложение?


2-1189580698
artem779
2007-09-12 11:04
2007.10.07
область видимости


2-1189091338
Igor_
2007-09-06 19:08
2007.10.07
Шрифт в польской Windows XP


3-1180700085
nick_van_rijn
2007-06-01 16:14
2007.10.07
исключение параметров из запроса не меняя тело