2012-07-18 63 views
4

获取任意Windows区域的最快方式是什么?如何计算像素区域的Windows区域(HRGN)?

我知道我可以枚举边界矩形的所有点并调用PtInRegion()函数,但它似乎不是很快。也许你知道一些更快的方法?

+2

大概['GetRegionData'(http://msdn.microsoft.com/en-us/library/windows/desktop/dd144920(V = vs.85) .aspx)并使用点来计算多边形的面积 – 2012-07-18 14:17:00

回答

10

当您拨打GetRegionData时,您将看到构成该区域的非重叠矩形列表。加入了他们的领域,这样的事情:

function GetRegionArea(rgn: HRgn): Cardinal; 
var 
    x: DWord; 
    Data: PRgnData; 
    Header: PRgnDataHeader; 
    Rects: PRect; 
    Width, Height: Integer; 
    i: Integer; 
begin 
    x := GetRegionData(rgn, 0, nil); 
    Win32Check(x <> 0); 
    GetMem(Data, x); 
    try 
    x := GetRegionData(rgn, x, Data); 
    Win32Check(x <> 0); 
    Header := PRgnDataHeader(Data); 
    Assert(Header.iType = rdh_Rectangles); 

    Assert(Header.dwSize = SizeOf(Header^)); 
    Rects := PRect(Cardinal(Header) + Header.dwSize); 
    // equivalent: Rects := PRect(@Data.Buffer); 

    Result := 0; 
    for i := 0 to Pred(Header.nCount) do begin 
     Width := Rects.Right - Rects.Left; 
     Height := Rects.Bottom - Rects.Top; 
     Inc(Result, Width * Height); 
     Inc(Rects); 
    end; 
    finally 
    FreeMem(Data); 
    end; 
end; 
+0

谢谢,Rob!这必须足够快 – Andrew 2012-07-18 14:39:31