图元文件剪裁矩形

时间:2013-03-21 10:20:50

标签: delphi clipping metafile

以下代码会带来一些麻烦:

procedure TForm1.Button1Click(Sender: TObject);
var dc : HDC;
    meta : TMetafile;
    metaCanv : TMetafileCanvas;
    cr : TRect;
    sz : TSize;
begin
     dc := GetDC(0);
     SetWindowExtEx(dc, 4800, 1300, @sz);
     ShowMessage(Format('size %d, %d', [sz.cx, sz.cy]));

     meta := TMetafile.Create;

     meta.SetSize(4500, 1300);

     metaCanv := TMetafileCanvas.Create(meta, dc);
     try
        IntersectClipRect(metaCanv.Handle, 0, 0, 4600, 1300);

        cr := metaCanv.ClipRect;

        with cr do
             ShowMessage(Format('clip rect: %d, %d, %d, %d', [Top, Left, Bottom, Right]));

     finally
            metaCanv.Free;
            meta.Free;
     end;


     DeleteDC(dc);
end;

问题是裁剪矩形绑定到显示分辨率,例如如果您的屏幕宽度为1920像素,则剪切矩形将绑定到此值。

请注意,根本不删除剪裁并将线条事件绘制到完整的底部直角。如果设置剪辑区域(例如,如示例中所示的完整图元文件宽度/高度)然后绘制线条,则会出现问题 - >它被裁剪到屏幕宽度/高度。

我知道我可以使用例如一个打印机直流作为参考,基本上可以解决问题,但有一些副作用(例如gdi +绘制元文件与此类 dc根本不起作用。)

任何人都知道如何“欺骗”系统,使得这种奇怪的剪辑行为不会 还有吗?

1 个答案:

答案 0 :(得分:3)

ClipRect是你可以画出的唯一部分是错误的推定。

TCustomCanvas.ClipRect上的文档:

  

使用ClipRect确定画布需要绘画的位置。

通过超越ClipRect绘图并尝试显示绘制的内容,可以轻松验证这一点,例如:

procedure TForm1.Button1Click(Sender: TObject);
var
  MetaFile: TMetafile;
  MetaCanvas: TMetafileCanvas;
begin
  MetaFile := TMetafile.Create;
  try
    MetaCanvas := TMetafileCanvas.Create(MetaFile, 0);
    try
      MetaFile.SetSize(4500, 1300);
      MetaCanvas.LineTo(4500, 1300);
    finally
      MetaCanvas.Free;
    end;
    Canvas.Draw(-4400, -1200, MetaFile);
  finally
    MetaFile.Free;
  end;
end;

enter image description here