Direct2D を利用する - Delphi 2010

Delphi2010の新機能のDirect2Dを試してみます。

TDirect2DCanvasはコンポーネントが用意されているわけではなく、TDirect2DCanvasをコード中で作成し、コンストラクタの引数に描画先のCanvasクラスを与えます。
以後、TDirect2DCanvasクラスを用い画面描画のメソッドを呼び出す形になります。
コードは以下の通り
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Direct2D, D2D1, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    Button1: TButton;
    PaintBox2: TPaintBox;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  LD2DCanvas: TDirect2DCanvas;
  pa:D2D_POINT_2F;
  pb:D2D_POINT_2F;
begin
  LD2DCanvas := TDirect2DCanvas.Create(PaintBox1.Canvas, PaintBox1.ClientRect);
  LD2DCanvas.RenderTarget.BeginDraw;

  LD2DCanvas.RenderTarget.SetAntialiasMode(D2D1_ANTIALIAS_MODE_PER_PRIMITIVE);
  LD2DCanvas.RoundRect(10,10,100,100,20,20);

  pa.x:=100;
  pa.y:=10;
  pb.x:=120;
  pb.y:=120;
  LD2DCanvas.DrawLine(pa,pb);
  LD2DCanvas.TextOut(120,10,''''Direct2D Test'''');
  //LD2DCanvas.RenderTarget.DrawRoundedRectangle(

  LD2DCanvas.RenderTarget.EndDraw;
  //

  PaintBox2.Canvas.RoundRect(10,10,100,100,20,20);
  PaintBox2.Canvas.MoveTo(100,10);
  PaintBox2.Canvas.LineTo(120,120);
  PaintBox2.Canvas.TextOut(120,10,''''Direct2D Test'''');

end;

end.

実行結果は以下の通り。

拡大してみると、アンチエイリアスが効いていることがわかります。

文字列描画に関しては、アンチエイリアスよりClearFontを利用した描画のほうが鮮明に見えるようです。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2009-09-04
iPentec all rights reserverd.