Как использовать рисование текста на холсте списка с помощью DirectWrite в Delphi?

Я ищу простой пример использования TDirect2DCanvas для рисования владельцем каждого элемента списка. Поиск в Google для DirectWrite дает результат примера примера для отображения текста в форме. Будучи студентом, мои навыки Delphi не могли правильно понять учебник. Простой пример или ссылка для рисования текста на холсте были бы для меня отличным началом.

Вот код (старый классический метод), который я пытаюсь реализовать с помощью DirectWrite:

procedure TForm2.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  LB: TListBox;
begin
  LB := TListBox(Control);

  if odSelected in State then begin
    LB.Canvas.Brush.Color := clPurple;

  end;

  LB.Canvas.FillRect(Rect);
  LB.Canvas.TextOut(Rect.Left + 10, Rect.Top + 5, LB.Items[Index]);
end;

person Rabi Jayasawal    schedule 20.11.2015    source источник
comment
Похоже, вы хотите, чтобы мы перевели ваш код для вас. Если вам не удастся разобраться в руководствах и документах, вы не сможете создать код. Вы не думали нанять программиста? Почему вы все равно хотите прекратить использование GDI?   -  person David Heffernan    schedule 21.11.2015
comment
Я пытаюсь преодолеть эти проблемы: stackoverflow.com/questions/33789279/ и stackoverflow.com/questions/33149592/   -  person Rabi Jayasawal    schedule 21.11.2015
comment
docwiki.embarcadero.com/RADStudio/Seattle/en/   -  person David Heffernan    schedule 21.11.2015
comment
Ожидайте, что D2D будет не быстрее, если не медленнее, чем GDI   -  person David Heffernan    schedule 21.11.2015


Ответы (1)


Код, который вы разместили, будет переведен примерно в следующее:

var
  Direct2DCanvas: TDirect2DCanvas;
  LB: TListBox;
begin
  LB := TListBox(Control);

  Direct2DCanvas := TDirect2DCanvas.Create(LB.Canvas, LB.ClientRect);
  Direct2DCanvas.BeginDraw;
   try
    if odSelected in State then begin
      Direct2DCanvas.Brush.Color := clPurple;
    end;

    Direct2DCanvas.FillRect(Rect);
    Direct2DCanvas.TextOut(Rect.Left + 10, Rect.Top + 5, LB.Items[Index]);
  finally
    Direct2DCanvas.EndDraw;
    Direct2DCanvas.Free;
  end;
end;

Однако имейте в виду, что создание и уничтожение экземпляра TDirect2DCanvas сильно замедляет работу. В конце концов, как указал Дэвид, он, вероятно, может быть медленнее, чем GDI.

Это говорит о том, что это может быть быстрее, если это делается на более низком уровне и если происходит много отрисовки или если вы полагаетесь на отрисовку со сглаживанием (которую GDI не может предложить).

Чтобы реализовать отрисовку на более низком уровне, вы должны получить собственный компонент TListBox и реализовать обработку изменения размера и отрисовки для дополнительного TDirect2DInstance (если он доступен). Это объясняется в (уже предоставленной) ссылке Дэвида.

person CWBudde    schedule 15.06.2017