以下代码使相当一些麻烦:元文件剪裁矩形
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根本不起作用)。
任何人都知道如何“欺骗”系统,使这种奇怪的剪辑行为不是 还有吗?
我看不清“奇剪裁”,根据需要工作,您使用剪辑的意图是什么? – bummi 2013-03-21 10:50:17
你看不到奇怪的剪辑? showmessage不显示与4600,1300不同的值吗?至少在我的电脑(和其他)上,这段代码显示了3600,1200(这是我的桌面宽度),而其他则只显示了1920x1200(现在最常见)的值。 – mrabat 2013-03-21 12:43:54
我认为默认的cliprect是与桌面大小相反的,因为这是可视部分而不是可绘制部分。你可能想看看http://stackoverflow.com/questions/9739124/weirdness-with-setwindowext-and-setwindowextex-negative-height-upside-down来设置你的图元文件,看看是否给你一个更好的剪辑。如果不是,那么应该无关紧要,因为您可以在剪辑外绘制。 – 2013-03-21 13:15:12