В этой статье приведена следующая информация:
регионы теперь не привязаны к координатам устройства и подчиняются координатным преобразованиям.
Никак не получается это осуществить. Может кто использовал этот функционал? У меня только как в первой GDI получается крутить холст целиком. Как применять координатные преобразования именно к региону?
Регионы: в отличие от GDI, регионы теперь не привязаны к координатам устройства и подчиняются координатным преобразованиям
Это странная сентенция. В GDI регионы работают в логических координатах (page coordinate system, logical pixels), а не в device координатах. И они подвергаются мировым преобразованиям. Пример:
var
hr: HRGN;
xf: XFOrm;
begin
xf.eM11 := 0.87;
xf.eM12 := -0.5;
xf.eM21 := 0.5;
xf.eM22 := 0.87;
xf.eDx := -50;
xf.eDy := 50;
SetGraphicsMode(Canvas.Handle, GM_ADVANCED);
SetWorldTransform(Canvas.Handle, xf);
hr := CreateRectRgn(120, 120, 220, 220);
Canvas.Brush.Color := clGreen;
FillRgn(Canvas.Handle, hr, Canvas.Brush.Handle);
Как бы то ни было, фраза подчиняются координатным преобразованиям не означает, что матрица преобразования применяется только к выбранному региону.
Возможно, желаемого эффекта можно достичь, используя регион отсечения.
Простенький примерчик на примере геометрических путей (Path), работа с регионами абсолютно аналогична:
Const
PolyPoints: Array[0..8] Of TGPPoint =
((x: 50 ; y: 50 ),
(x: 100 ; y: 50 ),
(x: 150 ; y: 100 ),
(x: 100 ; y: 150 ),
(x: 150 ; y: 200 ),
(x: 100 ; y: 250 ),
(x: 150 ; y: 300 ),
(x: 100 ; y: 350 ),
(x: 50 ; y: 350));
Cnt = 45;
Var
I: Integer;
FGDIPlus: TGPGraphics;
Pen: TGPPen;
Path: TGPGraphicsPath;
solidBrush: TGPSolidBrush;
RMatr, TMatr: TGPMatrix;
Begin
FBitmap.SetSize(Width, Height);
FGDIPlus := TGPGraphics.Create(FBitmap.Canvas.Handle);
//
Pen := TGPPen.Create(TGPColor.Create(255, 0, 0, 0), 1 / FGDIPlus.GetDpiX);
Path := TGPGraphicsPath.Create;
Path.AddPolygon(PolyPoints);
TMatr := TGPMatrix.Create;
TMatr.Translate(Width / 2, Height / 2);
TMatr.Scale(-0.5, -0.5);
Path.Transform(TMatr);
RMatr := TGPMatrix.Create;
RMatr.RotateAt(360 / Cnt, TGPPointF.Create(Width / 2, Height / 2));
For I := 0 To Cnt Do Begin
solidBrush := TGPSolidBrush.Create(TGPColor.Create(255 - I * (255 Div Cnt), 255 - I * (255 Div Cnt), I * (255 Div Cnt), 0));
FGDIPlus.FillPath(SolidBrush, Path);
FGDIPlus.DrawPath(Pen, Path);
solidBrush.Free;
// Rgn.Transform(RMatr);
Path.Transform(RMatr);
End;
RMatr.Free;
TMatr.Free;
Path.Free;
Pen.Free;
End;
Сборка персонального компьютера от Artline: умный выбор для современных пользователей