2013-03-21 103 views
1

以下代码使相当一些麻烦:元文件剪裁矩形

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根本不起作用)。

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

+0

我看不清“奇剪裁”,根据需要工作,您使用剪辑的意图是什么? – bummi 2013-03-21 10:50:17

+0

你看不到奇怪的剪辑? showmessage不显示与4600,1300不同的值吗?至少在我的电脑(和其他)上,这段代码显示了3600,1200(这是我的桌面宽度),而其他则只显示了1920x1200(现在最常见)的值。 – mrabat 2013-03-21 12:43:54

+1

我认为默认的cliprect是与桌面大小相反的,因为这是可视部分而不是可绘制部分。你可能想看看http://stackoverflow.com/questions/9739124/weirdness-with-setwindowext-and-setwindowextex-negative-height-upside-down来设置你的图元文件,看看是否给你一个更好的剪辑。如果不是,那么应该无关紧要,因为您可以在剪辑外绘制。 – 2013-03-21 13:15:12

回答

3

ClipRect是你可以画的唯一部分是一个错误的推定。

的文档上TCustomCanvas.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; 

enter image description here

+2

谢谢!你救了我的一天。我完全不知道cliprect函数没有返回实际的设置剪切区域,而只是需要重新绘制的部分 - 所以现在完全有意义的是,gdi认为没有什么需要在屏幕分辨率后面绘制。 – mrabat 2013-03-21 13:48:16