Как применять координатные преобразования к региону в GDI+?

215
10 ноября 2018, 03:30

В этой статье приведена следующая информация:

регионы теперь не привязаны к координатам устройства и подчиняются координатным преобразованиям.

Никак не получается это осуществить. Может кто использовал этот функционал? У меня только как в первой GDI получается крутить холст целиком. Как применять координатные преобразования именно к региону?

Answer 1

Регионы: в отличие от 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);

Как бы то ни было, фраза подчиняются координатным преобразованиям не означает, что матрица преобразования применяется только к выбранному региону.

Возможно, желаемого эффекта можно достичь, используя регион отсечения.

Answer 2

Простенький примерчик на примере геометрических путей (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;
READ ALSO
Как обезопасить приложение от патча?

Как обезопасить приложение от патча?

Есть приложение которое защищено проверкой подписи, но есть патч который подменяет оригинальную подпись -> она всегда вернаПатч изменяет...

203
java hibernate sequence

java hibernate sequence

Caused by: orgpostgresql

203
Google map fragment Второй день мучаюсь с ошибкой

Google map fragment Второй день мучаюсь с ошибкой

Уже второй день пытаюсь прикрутить google карту, но все четноВ основном, брал инфу из документации google

243