delphi - 图元文件剪切矩形

标签 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;

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

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

我知道我可以使用例如打印机 dc 作为引用,基本上可以解决问题,但有一些副作用(例如,gdi+ 在图元文件上绘制这样的 dc 根本不起作用)。

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

最佳答案

ClipRect 是唯一可以绘制的部分是一个错误的假设。

关于 TCustomCanvas.ClipRect 的文档:

Use ClipRect to determine where the canvas needs painting.

这可以通过在 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

关于delphi - 图元文件剪切矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15544766/

相关文章:

Delphi XE4 Indy TBytes 和 TidBytes 之间的兼容性问题

java - XML 绑定(bind)生成文件不编译

Java:创建有孔的剪切区域?

SVG clipPath 将 *outer* 内容剪掉

r - par(xpd) 不剪辑条形图?

Delphi - 错误代码 126 是什么意思

delphi - 如何将 TServerSocket 绑定(bind)到特定 IP 地址

c# - 如何显示 Windows 图元文件?

c# - 在 C#/WPF/WinForms 中将 WMF 渲染为 BitMap 时如何启用抗锯齿?

r - 如何更改 Rmarkdown 中元文件图形输出的尺寸?