2011-08-02 3 views
1

A3 프린터 캔버스에 그림을 그립니다.D-7에서 캔버스의 회전 된 부분을 그리는 방법은 무엇입니까?

캔버스의 다른 부분에 회전 된 회전 (180도)을 그릴 수 있습니까?

감사합니다. 마찬가지로 Sertac 이미 주석

+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로 예를 들면 할 수있다. 그러나이 짧은 사람은 일을합니다.

관련 문제