私はA3プリンタキャンバスに何かを描いています。D-7でキャンバスの回転部分を描く方法は?
キャンバスの一部を180度回転させたキャンバスの一部をキャンバスの別の部分にコピーすることはできますか?
ありがとうございます! Sertac同様
私はA3プリンタキャンバスに何かを描いています。D-7でキャンバスの回転部分を描く方法は?
キャンバスの一部を180度回転させたキャンバスの一部をキャンバスの別の部分にコピーすることはできますか?
ありがとうございます! Sertac同様
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;
あなたは一時的なビットマップに繰り返し部分をペイントし、一回転、プリンタのキャンバスにその倍のビットマップを描くことができます。回転は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が回転するだけでなく、スケールだけでなくので、より効率的な方法で回転ルーチンは、利用可能です。しかし、この短い人は仕事をします。
私は、描画コードをルーチンに抽象化してから、2回、1回回転しないでもう一度回転させる方が良いと思います。 –
多くの行、テキストがあります。それが私が180度回転させるといいと思った理由です。 – John
なぜ180度の回転をしたいのですか?それは一般的なローテーションよりもはるかに簡単です! –