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现在完全有理由认为屏幕分辨率后面不需要绘制任何内容。