Как нарисовать повернутую часть холста в D-7? - PullRequest
1 голос
/ 02 августа 2011

Я что-то рисую на холсте принтера A3.

Можно ли скопировать часть холста и рисовать вращается (180 градусов) в другой части холста?

Спасибо!

Ответы [ 2 ]

7 голосов
/ 02 августа 2011

Как уже прокомментировал Сертак, используйте SetWorldTransform:

procedure TForm1.Button1Click(Sender: TObject);
var
  XForm: TXForm;
begin
  if PrintDialog1.Execute then
    with Printer do
    begin
      BeginDoc;
      SetGraphicsMode(Canvas.Handle, GM_ADVANCED);
      PrintTo(Canvas);
      XForm.eM11 := Cos(DegToRad(180));
      XForm.eM12 := Sin(DegToRad(180));
      XForm.eM21 := -Sin(DegToRad(180));
      XForm.eM22 := Cos(DegToRad(180));
      XForm.eDx := PageWidth;
      XForm.eDy := PageHeight;
      SetWorldTransform(Canvas.Handle, XForm);
      PrintTo(Canvas);
      EndDoc;
    end;
end;

procedure TForm1.PrintTo(ACanvas: TCanvas);
begin
  with ACanvas do
  begin
    Font.Size := 180;
    TextOut(0, 0, 'Test text');
    Pen.Width := 40;
    MoveTo(0, 0);
    LineTo(3000, 3000);
  end;
end;

enter image description here

0 голосов
/ 02 августа 2011

Вы можете нарисовать повторяющуюся часть во временное растровое изображение и нарисовать это растровое изображение дважды на холсте принтера, после поворота.Поворот можно выполнить, например, с помощью PlgBlt :

procedure RotateBitmap180(Source, Dest: TBitmap);
var
  Points: array[0..2] of TPoint;
begin
  if (Source <> nil) and (Dest <> nil) then
    with Source, Canvas do
    begin
      Dest.Width := Width;
      Dest.Height := Height;
      Points[0].X := Width - 1;
      Points[0].Y := Height - 1;
      Points[1].X := -1;
      Points[1].Y := Height - 1;
      Points[2].X := Width - 1;
      Points[2].Y := -1;
      PlgBlt(Dest.Canvas.Handle, Points, Handle, 0, 0, Width, Height, 0, 0, 0);
      Dest.Modified := True;
    end;
end;

Примечание: существуют более эффективные процедуры поворота, поскольку PlgBlt не только вращает, но и масштабирует.Но этот короткий делает работу.

...