Конференция "Прочее" » Ручная отрисовка ячеек TListView, позиция текста.
 
  • Kolan © (17.11.08 09:02) [0]
    Здравствуйте,
     Мне нужно получить ЛистВью с высокими строками, но с мелким шрифтом внутри.

    Для этого я задал ему шрифт 22 пункта, а в
    OnCustomDrawItem

    устанавливаю более мелкий шрифт.

     with Sender.Canvas do
     begin
       Font.Size := 12;


    В результате я получаю почти то, что надо, но только текст находится в верхнем левом углу ячеек. Как изменить позицию текста? Можно было бы вручную отрисоавть надпись, но в событие не передается
    Rect

    и я не знаю как это сделать без него.

    Вполне возможно, что я вообще пошел по неверному пути, может есть способ лучше?
  • AIK © (17.11.08 09:22) [1]

    > Здравствуйте,  Мне нужно получить ЛистВью с высокими строками,
    >  но с мелким шрифтом внутри.


    Что за ячейки у T TListView? Как понять: с высокими строками, но с мелким шрифтом внутри.


    > В результате я получаю почти то, что надо, но только текст
    > находится в верхнем левом углу ячеек. Как изменить позицию
    > текста? Можно было бы вручную отрисоавть надпись, но в событие
    > не передается Rect и я не знаю как это сделать без него.
    >


    Как я понял текст через канву хочешь выводить canvas.TextOut(x, y, ‘TEXT’) – где x позиция текста по горизонтали, где y по вертикали


    > Вполне возможно, что я вообще пошел по неверному пути, может
    > есть способ лучше?


    Да, вопрос надо было в "Начинающим" задовать
  • Kolan © (17.11.08 09:26) [2]
    > Как понять: с высокими строками, но с мелким шрифтом внутри.

    http://www.ksoftware.ru/files/other/ListView.gif

    >Да, вопрос надо было в "Начинающим" задовать
    Случайно ошибся форумом, туда и хотел.
  • AIK © (17.11.08 09:48) [3]

    > canvas.TextOut(x, y, ‘TEXT’) – где x позиция текста по горизонтали,
    >  где y по вертикали


    Так это тебе неподходит чтоли?
    если через Rect: TRect

    canvas.TextOut(Rect.Left, Rect.Top, ‘TEXT’)
  • Kolan © (17.11.08 10:06) [4]
    У ЛисьВью в событие Rect не передается

    procedure TCalibrationScreen.CalibrationListViewCustomDrawItem(
     Sender: TCustomListView; Item: TListItem; State: TCustomDrawState;
     var DefaultDraw: Boolean);

  • Kolan © (17.11.08 14:54) [5]
    Я, честно не понимаю как эделать сабж.

    ЗЫ
     Перенестие в Начинающие.
  • Dimka Maslov © (17.11.08 15:57) [6]
    Когда я обошёлся написанием собственного компонента-аналога, в котором можно было изголяться как попало при отрисовке элементов.
  • Leonid Troyanovsky © (17.11.08 16:18) [7]

    > Kolan ©   (17.11.08 10:06) [4]

    > У ЛисьВью в событие Rect не передается

    Item.DisplayRect?

    --
    Regards, LVT.
  • Kolan © (18.11.08 16:25) [8]
    Спасибо Леонид, откуда брать рект понятно.

    Все равно что-то не получается. Я использую одну функцию для двух обработчиков.

    Вот так выглядит вызов:
    procedure TCalibrationScreen.CalibrationListViewCustomDrawItem(
     Sender: TCustomListView; Item: TListItem; State: TCustomDrawState;
     var DefaultDraw: Boolean);
    begin
     inherited;
     DrawCalibrationListViewItems(Sender, Item);
    end;

    procedure TCalibrationScreen.CalibrationListViewCustomDrawSubItem(
     Sender: TCustomListView; Item: TListItem; SubItem: Integer;
     State: TCustomDrawState; var DefaultDraw: Boolean);
    begin
     inherited;
     DrawCalibrationListViewItems(Sender, Item, SubItem);
    end;



    Вот сама функция отрисовки.
    procedure DrawCalibrationListViewItems(Sender: TCustomListView;
     Item: TListItem; SubItemIndex: Integer);
    var
     Measurement: TCalibrationMeasurement;
     Rect: TRect;
     S: string;
    begin
     with Sender.Canvas do
     begin
       if TObject(Item.Data) is TCalibrationMeasurement then
       begin
         Measurement := TCalibrationMeasurement(Item.Data);
         if Assigned(Measurement) then
         begin
           if Measurement.Measurement.ID = -1 then
           begin
             Font.Color := clBlack
           end
           else
             if Measurement.Measurement.DefectDescription <> '' then
               Font.Color := clRed
             else
               Font.Color := clGreen;
         end;
       end;

       Rect := Item.DisplayRect(drBounds);
       if (SubItemIndex < 0) or (SubItemIndex > (Item.SubItems.Count-1)) then
         S := Item.Caption
       else
         S := Item.SubItems[SubItemIndex];

       Font.Size := 10;
       FillRect(Rect);
       TextOut(Rect.Left+20, Rect.Top+20, S);

     end;
    end;



    Результат (http://www.ksoftware.ru/files/other/ListView2.gif) странный. Как видите, сместилася текст только первой колонки, то есть самого айтима. Суб айтимы не отрисовались все кроме последнего. Хотя я, в отладчике, виже, что в S попадаеют нужные строки.
  • Leonid Troyanovsky © (19.11.08 19:47) [9]

    > Kolan ©   (18.11.08 16:25) [8]

    > Все равно что-то не получается. Я использую одну функцию

    В demos есть пара примеров с TListView, в т.ч. и с виртуальным.
    Если не сумеешь разобраться, то настаивай на перемещение
    к "Начинающим", или в "Основную" -
    вдруг там есть эксперт по этому вопросу ;)

    --
    Regards, LVT.
 
Конференция "Прочее" » Ручная отрисовка ячеек TListView, позиция текста.
Есть новые Нет новых   [134446   +31][b:0][p:0.002]