Delphi 2010 - Direct2D

vložil Radek Červinka 14. března 2010 22:59

Ve Windows 7 je nová API možnost - Direct2D, tj. možnost použít část Direct X pro akcelerované zobrazení i v normálních aplikacích. Jedná se samozřejmě o nativní API (tj. je dostupné pro normální kompilované aplikace) - stejně jako všechny ostatní nové API. MS slibuje, že rozhraní bude dostupné i pro Windows Vista (aktuální stav nevím), o XP se jen uvažovalo. Proti klasickým DirectX aplikacím umožňuje Direct2D míchat normální (GDI) zobrazení a nové v jednom okně.

Delphi 2010 přináší pro toto rozhraní podporu a to velmi pěkným způsobem. Nově existuje následník klasické třídy TCanvas s názvem TDirect2DCanvas a tato třída (plus pár jednotek) zajišťuje slušnou podporu.

Nové API přináší kromě akcelerace i průhlednost, transformace, vyhlazování, ID2D1Geometry (teselace…) atd.

Pro programování je nutné použít tyto dvě jednotky: Direct2D, D2D1. Uvedená třída publikuje některé klasické metody, pokud potřebujete něco z Direct2D tak přes metodu RenderTarget. Implementace klasických metod Vám napoví ohledně implementace vlastních metod.

Aspoň malé demo. Mějme klasickou VCL aplikaci, s událostmi OnCreate, OnPaint. A pamatujte, že primární určení jsou Windows 7.

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    FCanvas: TDirect2DCanvas;
  protected
    procedure Paint; override;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
  if not TDirect2DCanvas.Supported then
  begin
    ShowMessage('Direct2D není podporován!');
    Application.Terminate;
  end;
end;

procedure TForm1.Paint;
var
  I: Integer;
  d2dCanvas: TDirect2DCanvas;
begin
  d2dCanvas := TDirect2DCanvas.Create(Canvas, ClientRect);
  d2dCanvas.Brush.Assign(Canvas.Brush);
  d2dCanvas.BeginDraw;
  try
    d2dCanvas.Brush.Color := clGreen;
    d2dCanvas.Pen.Color := clBlue;
    for I := 1 to 10 do
    begin
      d2dCanvas.Brush.Handle.SetOpacity(0.1 * I);
      d2dCanvas.RoundRect(10, 10, 300 - I * 20, 300 - I * 20, 20, 20);
    end;
  finally
    d2dCanvas.EndDraw;
    d2dCanvas.Free;
  end;
end;
end.

Delphi Direct2D

Další příklady Chris Bensen, MSDN a hlavně v knize Delphi 2010 Handbook.

Jen ještě část rozhraní TDirect2DCanvas:

  TDirect2DCanvas = class(TCustomCanvas)
//…………
  public
    class function Supported: Boolean; //Direct2D podporováno

    constructor Create(DC: HDC; SubRect: TRect); overload;
    constructor Create(Canvas: TCanvas; SubRect: TRect); overload;
    constructor Create(Handle : HWND); overload;

    function CreateBrush(Color: TColor): ID2D1Brush; overload;
    function CreateBrush(Bitmap: TBitmap): ID2D1Brush; overload;
    function CreateBrush(Colors: array of TColor; StartPoint, EndPoint: TD2D1Point2F):
           ID2D1Brush; overload;
    function CreateBrush(Colors: array of TColor; Center, Offset: TD2D1Point2F;
      RadiusX, RadiusY: Single): ID2D1Brush; overload;

    function CreateBitmap(Bitmap: TBitmap): ID2D1Bitmap;

    procedure BeginDraw;
    procedure EndDraw;

    procedure DrawEllipse(const Ellipse: TD2D1Ellipse);
    procedure DrawGeometry(Geometry: ID2D1Geometry);
    procedure DrawLine(Point0, Point1: TD2DPoint2f);
    procedure DrawRectangle(const Rect: TD2D1RectF);
    procedure DrawRoundedRectangle(const RoundedRect: TD2D1RoundedRect);

    procedure FillEllipse(const Ellipse: TD2D1Ellipse);
    procedure FillGeometry(Geometry: ID2D1Geometry);
    procedure FillRectangle(const Rect: TD2D1RectF);
    procedure FillRoundedRectangle(const roundedRect: TD2D1RoundedRect);

    // Override common functions from TCustomCanvas
    procedure Arc(X1: Integer; Y1: Integer; X2: Integer; Y2: Integer;
      X3: Integer; Y3: Integer; X4: Integer; Y4: Integer); override;
    procedure Chord(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer); override;
    procedure FillRect(const Rect: TRect); override;
    procedure FrameRect(const Rect: TRect); override;
    procedure Ellipse(X1, Y1, X2, Y2: Integer); override;
    procedure Rectangle(X1, Y1, X2, Y2: Integer); override;
    procedure RoundRect(X1, Y1, X2, Y2, X3, Y3: Integer); override;
    procedure Draw(X, Y: Integer; Graphic: TGraphic); overload; override;
    procedure Draw(X, Y: Integer; Graphic: TGraphic; Opacity: Byte); overload; override;
    procedure StretchDraw(const Rect: TRect; Graphic: TGraphic); overload; override;
    procedure StretchDraw(const Rect: TRect; Graphic: TGraphic; 
          Opacity: Byte); reintroduce; overload;
    procedure Pie(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer); override;
    procedure PolyBezier(const Points: array of TPoint); override;
    procedure Polygon(const Points: array of TPoint); override;
    procedure Polyline(const Points: array of TPoint); override;

    procedure LineTo(X, Y: Integer); override;
    procedure MoveTo(X, Y: Integer); override;
    procedure PolyBezierTo(const Points: array of TPoint); override;
    procedure Refresh; override;

    function TextExtent(const Text: string): TSize; override;
    procedure TextOut(X, Y: Integer; const Text: string); override;
    procedure TextRect(var Rect: TRect; var Text: string; 
            TextFormat: TTextFormat = []); overload; override;
    procedure TextRect(Rect: TRect; X, Y: Integer; const Text: string); overload; override;

    // Operations from TCustomCanvas that are invalid on a TDirect2DCanvas
    procedure BrushCopy(const Dest: TRect; Bitmap: TBitmap;
      const Source: TRect; Color: TColor); override;
    procedure DrawFocusRect(const Rect: TRect); override;  
          // Doesn't have a concept of XOR brushes/pens
    procedure FloodFill(X, Y: Integer; Color: TColor; 
          FillStyle: TFillStyle); override;

// zpristupnení zbytku rozhraní Direct2D
    property RenderTarget : ID2D1RenderTarget read GetRenderTarget;
    property Brush: TDirect2DBrush read GetBrush write SetBrush;
    property Pen: TDirect2DPen read GetPen write SetPen;
    property Font: TDirect2DFont read GetFont write SetFont;
  end;

Tagy: , ,

Recenze

Komentování ukončeno

Naše nabídka

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy).

love Delphi

O Delphi.cz

Delphi je moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64, Mac OSX, Linux a na iPhone a Android.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Poslední komentáře

Comment RSS

Dle měsíců