4
获取任意Windows区域的最快方式是什么?如何计算像素区域的Windows区域(HRGN)?
我知道我可以枚举边界矩形的所有点并调用PtInRegion()
函数,但它似乎不是很快。也许你知道一些更快的方法?
获取任意Windows区域的最快方式是什么?如何计算像素区域的Windows区域(HRGN)?
我知道我可以枚举边界矩形的所有点并调用PtInRegion()
函数,但它似乎不是很快。也许你知道一些更快的方法?
当您拨打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;
谢谢,Rob!这必须足够快 – Andrew 2012-07-18 14:39:31
大概['GetRegionData'(http://msdn.microsoft.com/en-us/library/windows/desktop/dd144920(V = vs.85) .aspx)并使用点来计算多边形的面积 – 2012-07-18 14:17:00