首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在D-7中绘制画布的旋转部分?

如何在D-7中绘制画布的旋转部分?
EN

Stack Overflow用户
提问于 2011-08-02 18:18:11
回答 2查看 2.4K关注 0票数 1

我正在A3打印机画布上绘制一些东西。

是否可以复制画布的一部分,并在画布的另一部分中进行旋转(180度)绘制?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-02 21:07:46

就像Sertac已经评论过的那样,使用SetWorldTransform

代码语言:javascript
复制
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;

票数 7
EN

Stack Overflow用户

发布于 2011-08-02 22:51:35

您可以将重复的部分绘制为临时位图,然后在打印机的画布上绘制两次该位图,一次旋转。例如,可以使用PlgBlt来完成旋转

代码语言:javascript
复制
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不仅可以旋转,还可以缩放。但是这个短小的代码就可以完成这项工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6910496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档