2011-08-02 9 views
1

私はA3プリンタキャンバスに何かを描いています。D-7でキャンバスの回転部分を描く方法は?

キャンバスの一部を180度回転させたキャンバスの一部をキャンバスの別の部分にコピーすることはできますか?

ありがとうございます! Sertac同様

+1

私は、描画コードをルーチンに抽象化してから、2回、1回回転しないでもう一度回転させる方が良いと思います。 –

+0

多くの行、テキストがあります。それが私が180度回転させるといいと思った理由です。 – John

+0

なぜ180度の回転をしたいのですか?それは一般的なローテーションよりもはるかに簡単です! –

答えて

7

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

ありがとうございます。しかし、私は質問があります。 msdnによると私は呼び出す必要があります:SetGraphicsMode(Fcanvas.Handle、GM_ADVANCED);世界の変換を使用する前に。しかし、その後、すべての混乱。また、ミラー反射はベース画像に対して少し動いていますが、正しいページサイズ設定を適用しました。 .. – John

+0

それはここで騒がしくない。プリンタードライバーのデバイス機能が高度なグラフィックスモードをサポートしていない可能性がありますか?私はあなたのコードを私の答えに加えました。なぜならあなたは正しいからです。 – NGLN

0

あなたは一時的なビットマップに繰り返し部分をペイントし、一回転、プリンタのキャンバスにその倍のビットマップを描くことができます。回転は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が回転するだけでなく、スケールだけでなくので、より効率的な方法で回転ルーチンは、利用可能です。しかし、この短い人は仕事をします。

関連する問題