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.
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;