有谁知道用API创建区域的面积
CreateRectRgn
CreateRoundRectRgn
等的像素面积

解决方案 »

  1.   


    给你一个橡皮条,慢慢看吧:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      TForm1 = class(TForm)
        procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}type
      TDrawFlag = (dfToDraw,dfDrawing,dfDrawn);
    var
      TrackerBrush: TBrush = Nil;
      TrackerPen: TPen = Nil;
      HalfToneBrush:TBrush = Nil;
      OldDragRect: TRect = (Left:0;Top:0;Right:0;Bottom:0);
    procedure InitHalfToneBrush;
    var grayPattern:array[0..7] of WORD;
        grayBitmap:HBITMAP;
        I:Integer;
    begin
      if HalfToneBrush = Nil then
      begin
        HalfToneBrush := TBrush.Create;
        for I := 0 to 7 do
          grayPattern[i] := WORD(($5555 shl (I and 1)));
        grayBitmap := Windows.CreateBitmap(8, 8, 1, 1, @grayPattern);
        if (grayBitmap <> 0) then
        begin
          HalftoneBrush.Handle := Windows.CreatePatternBrush(grayBitmap);
          Windows.DeleteObject(grayBitmap);
        end;
      end;
    end;procedure DrawDragRect(DC:HDC;NewRect:TRect;DragFlag:TDrawFlag;BandWidth:Integer = 3);
    var rgnNew,rgnOld,rgnTemp:HRGN;
        SaveIndex: Integer;
        TempRect: TRect;
    begin
      SaveIndex := Windows.SaveDC(DC);
      try
        { Get the region which is the old border }
        if DragFlag = dfToDraw then rgnOld := 0
        else begin
          TempRect := OldDragRect;
          rgnTemp := Windows.CreateRectRgnIndirect(TempRect);
          Windows.InflateRect(TempRect,BandWidth,BandWidth);
          rgnOld := Windows.CreateRectRgnIndirect(TempRect);
          Windows.CombineRgn(rgnOld,rgnOld,rgnTemp,RGN_XOR);
          Windows.DeleteObject(HRGN(rgnTemp));
        end;    { Get the region which is the new border }
        if DragFlag = dfDrawn then  rgnNew := 0
        else begin
          TempRect := NewRect;
          //RectNormalize(TempRect);
          OldDragRect := TempRect;
          rgnTemp := Windows.CreateRectRgnIndirect(TempRect);
          Windows.InflateRect(TempRect,BandWidth,BandWidth);
          rgnNew := Windows.CreateRectRgnIndirect(TempRect);
          Windows.CombineRgn(rgnNew,rgnNew,rgnTemp,RGN_XOR);
          Windows.DeleteObject(HRGN(rgnTemp));
        end;    { Get the different region between new and old }
        if rgnNew = 0 then rgnNew := Windows.CreateRectRgn(0,0,0,0);
        Windows.CombineRgn(rgnNew,rgnNew,rgnOld,RGN_XOR);    { Draw into the border region which need to be updated }
        Windows.SelectClipRgn(DC,rgnNew);
        Windows.GetClipBox(DC,TempRect);
        Windows.SelectObject(DC,HalfToneBrush.Handle);
        with TempRect do
          Windows.PatBlt(DC,Left,Top,Right-Left,Bottom-Top,PATINVERT);    if rgnOld <> 0 then Windows.DeleteObject(HRGN(rgnOld));
        if rgnNew <> 0 then Windows.DeleteObject(HRGN(rgnNew));    { Remove the clip region }
        Windows.SelectClipRgn(DC,0);
      finally
        Windows.RestoreDC(DC,SaveIndex);
      end;
    end;
    procedure InitGlobalObjects;
    var
      HatchPattern: Array[0..7] of WORD;
      WPattern: WORD;
      I: Integer;
      HatchBitmap:HBITMAP;
    begin
      WPattern := $1111;
      if TrackerBrush = Nil then
      begin
        TrackerBrush := TBrush.Create;
        {Create the hatch pattern + bitmap}
        for I := 0 to 3  do
        begin
          HatchPattern[i] := WPattern;
          HatchPattern[i+4] := WPattern;
          WPattern := WPattern shl 1;
        end;    HatchBitmap := Windows.CreateBitmap(8, 8, 1, 1, @HatchPattern);
        if HatchBitmap <> 0 then
        begin
          { Create black hatched brush }
          TrackerBrush.Handle := Windows.CreatePatternBrush(HatchBitmap);
          Windows.DeleteObject(HatchBitmap);
        end;    if TrackerPen = Nil then
        begin
          TrackerPen := TPen.Create;
          {create black dotted pen}
          TrackerPen.Handle := CreatePen(PS_DOT, 0, RGB(0, 0, 0));
        end;
      end;  InitHalfToneBrush;
      OldDragRect := Rect(0,0,0,0);
    end;procedure ReleaseGlobalObjects;
    begin
      if HalfToneBrush  <> Nil then  HalfToneBrush.Free;
      if TrackerBrush <> Nil then  TrackerBrush.Free;
      if TrackerPen <> Nil then  TrackerPen.Free;
    end;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      DrawDragRect(Canvas.Handle,Rect(X,Y,X,Y),dfToDraw,4);
    end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if ssLeft in Shift then
      DrawDragRect(Canvas.Handle,Rect(OldDragRect.Left,OldDragRect.Top,X,Y),dfDrawing,4);
    end;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      DrawDragRect(Canvas.Handle,Rect(OldDragRect.Left,OldDragRect.Top,X,Y),dfDrawn,4);
    end;Initialization
      InitGlobalObjects;
    finalization
      ReleaseGlobalObjects;end.end.
      

  2.   

    wanderung(扬清) 
    这个区域可能是多个怪的区域合并而成的
    如半圆与长方形相交的区域,是没有计算公式的。
      

  3.   

    使用Path可以得到任意规则的区域:procedure TForm1.Button1Click(Sender: TObject);
    var R: TRect;
        HalfHeight: Integer;
        ArcRgn,RectRgn,DestRgn: HRGN;
        RetValue: Integer;
    begin
      R := GetClientRect;
      HalfHeight := (R.Top+R.Bottom) div 2;
      Canvas.Arc(R.Left,R.Top,R.Right,R.Bottom,R.Right,HalfHeight,R.Left,HalfHeight);
      Canvas.MoveTo(R.Left,HalfHeight);
      Canvas.LineTo(R.Right,HalfHeight);  BeginPath(Canvas.Handle);
      Canvas.Arc(R.Left,R.Top,R.Right,R.Bottom,R.Right,HalfHeight,R.Left,HalfHeight);
      //Canvas.Ellipse(100,20,200,120);
      EndPath(Canvas.Handle);
      ArcRgn := PathToRegion(Canvas.Handle);  Canvas.Rectangle(100,10,200,110);  BeginPath(Canvas.Handle);
      Canvas.Rectangle(100,10,200,110);
      EndPath(Canvas.Handle);
      RectRgn := PathToRegion(Canvas.Handle);  DestRgn := CreateRectRgn(0,0,0,0);
      RetValue := CombineRgn(DestRgn,ArcRgn,RectRgn,RGN_AND);
      {case RetValue of
        NULLREGION: ShowMessage('The region is empty.');
        SIMPLEREGION: ShowMessage(' The region is a single rectangle.');
        COMPLEXREGION: ShowMessage(' The region is more than a single rectangle.');
        ERROR: ShowMessage('ERROR');
      end;}
      Canvas.Brush.Color := clRed;
      FillRgn(Canvas.Handle,DestRgn,Canvas.Brush.Handle);
    end;
      

  4.   

    : Borlandor(五角▲大民) :  我现在需要的是区域像素面积有多大?
      有办法吗?
      先谢了
      

  5.   

    扫描,使用PtInRegion:K := 0;
    for i := 0 to 1023 do
    begin
      for i := 0 to 767 do
      begin
        if PtInRegion(YourRgn,i,j) then
        begin
          Inc(K);
        end;
      end;
    end;
      

  6.   

    Borlandor(五角▲大民) :
      我早知了那个函数但不方便与效率太低
      我是想有个PtInRegion的函数求面积
      有个getregiondata 求所有区域的属性,但不知怎求面积
      

  7.   

    getregiondata 也许可以,但我没有用过!
      

  8.   

    getregiondata
      我就是试不出来
      出现个N级的大数据,试了好多参数就是搞不定