有谁知道用API创建区域的面积
CreateRectRgn
CreateRoundRectRgn
等的像素面积
CreateRectRgn
CreateRoundRectRgn
等的像素面积
解决方案 »
- 关于tchart画图
- 面向对象,你可能知道,但不去贯彻,有什么意义?
- HELP ADO连接EXCLE的问题 急死人了 。。。。。。。。。。。。。。解决了 马上给分 嫌少再加
- 我是个新手,问个简单而又奇怪的问题。盼望各位前来顶帖,解答ing...............................................
- 用delphi建立ISAPI的WebServices出现的问题。
- 初入图象处理,求一个画线的单间例子
- 如何得到VB程序中一个控件的文字内容?
- 如何用Delphi编程实现Sql2000数据库中主从数据表的导出与导入??
- 如何继承一个tabSheet中的东东
- 关于ADO调用ACCESS数据库
- 安装了flatstyle控件后,在vcl 的palette上看不到刚刚安装的。如何?
- 为什么用DBE联接数据库会出现(要你输入数据库用户名和密码呀),怎么解决呀
给你一个橡皮条,慢慢看吧: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.
这个区域可能是多个怪的区域合并而成的
如半圆与长方形相交的区域,是没有计算公式的。
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;
有办法吗?
先谢了
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;
我早知了那个函数但不方便与效率太低
我是想有个PtInRegion的函数求面积
有个getregiondata 求所有区域的属性,但不知怎求面积
我就是试不出来
出现个N级的大数据,试了好多参数就是搞不定