Delphi 图元文件剪切矩形
下面的代码会带来很多麻烦:Delphi 图元文件剪切矩形,delphi,clipping,metafile,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(Fo
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像素,则剪切矩形与此值绑定
请注意,完全删除剪裁并将“绘制线”事件绘制到完整的底部矩形角并不成问题。如果设置了剪裁区域(例如,设置为示例中所示的完整图元文件宽度/高度),然后绘制线条->将其剪裁为屏幕宽度/高度,则会出现问题
我知道我可以使用例如打印机dc作为参考,这将基本上解决问题,但也有一些副作用(例如,gdi+使用此类工具在图元文件上绘图)
dc根本不起作用)
任何人都知道如何“欺骗”系统,以避免这种奇怪的剪裁行为
还有吗?
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;
我看不到“奇数剪辑”,按需要工作,您使用剪辑的意图是什么?您看不到什么奇数剪辑?showmessage显示的值不是46001300吗?至少在我的计算机(和其他计算机)上,此代码显示3600、1200(这是我的桌面宽度),其他代码仅显示1920x1200左右的值(现在最常见)。我认为默认的cliprect与桌面大小相对应,因为这是图元文件的可见部分,而不是可绘制部分。您可能需要研究如何设置图元文件,看看这是否能为您提供更好的cliprect。如果没有:这不重要,因为你可以在你的cliprect外画图。如果你使用IntersectClipRect,那么你可以对Win API说,将你给出的矩形与当前(屏幕大小)的剪切矩形相交。如果您想避免它,请使用setClipRgn而不是上面的一个。谢谢!你救了我一天。我完全没有意识到这样一个事实:cliprect函数不返回实际的设置剪辑区域,而只返回需要重新绘制的部分——因此gdi现在完全有理由认为屏幕分辨率后面不需要绘制任何内容。