2011-08-02 45 views
1

我正在繪製A3打印機畫布上的東西。如何在D-7中繪製畫布的旋轉部分?

是否可以複製畫布的一部分, 平局旋轉(180度),在畫布上的另一部分?

謝謝!

+1

我認爲你最好把繪圖代碼抽象成一個例程,然後繪製兩次,一次旋轉一次,再旋轉一次。 –

+0

有很多線條,文字。這就是爲什麼我認爲這將是很好的,如果我可以將它旋轉180度 – John

+0

爲什麼你不說你想旋轉180°?!這比一般的旋轉要容易得多! –

回答

7

像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; 

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不僅轉動而且還可以進行擴展。但是這個簡短的工作。