下面的代码会带来一些麻烦:
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;
关于delphi - 图元文件剪切矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15544766/