DELPHI中利用API函数实现多态FORM
点击次数:51 次 发布日期:2008-11-09 08:41:01 作者:源代码网
|
源代码网推荐 源代码网推荐 实现异型FORM并不是一件难事,本文将向您介绍如何利用API函数实现圆角矩形和椭圆形FORM,并在此基础之上探讨实现TWINcontrol类的后裔的异型的实现。 源代码网推荐 源代码网推荐 欲改变FORM的形状,也就是实现对区域(region)的控制。在Win32 API程序参考手册有关区域(region)的定义是这样描述的:它可以是一个矩形,多边形,椭圆形(或者是两者的复合,或者是更多的形状),这些都可以被填充,画图,翻转,结构化并可以得到焦点执行。 源代码网推荐 源代码网推荐 由定义得出结论:区域(region)是可以被改变和操纵的,依据我们的需求可定义区域并制作出我们所要求的形状。 源代码网推荐 源代码网推荐 应当指出的是区域(region)也能对任何TWINcontrol类的后裔定义和控制(不仅仅是FORMS),就是说,可以将区域(region)的定义运用到向Tpanel或TEdit这样的对象。在改变TWINcontrol类的后裔控件的形状时,需要提供一句柄并创建一些改变形状的函数。 源代码网推荐 源代码网推荐 具体实现方式一般分为两步: 源代码网推荐 源代码网推荐 1.定义所需形状的区域边界形状(比如:椭圆形)。 源代码网推荐 源代码网推荐 2.将已定义的区域边界形状运用到窗口。 源代码网推荐 源代码网推荐 这里,我们将通过调用Windows API函数完成以上两个步骤,下面就具体函数的应用予以说明: 源代码网推荐 源代码网推荐 实现第一步:定义区域边界。 源代码网推荐 源代码网推荐 在这里将调用三个WinAPI,这三个函数是: 源代码网推荐 源代码网推荐 CreateEllipticRgn()功能是生成椭圆形区域; 源代码网推荐 源代码网推荐 CreateRoundRectRgn()功能是生成圆角矩形区域; 源代码网推荐 源代码网推荐 CreatePolygonRgn()功能是生成多边形区域,Windows要确保使其顶点自动相连形成一封闭的区域。 源代码网推荐 源代码网推荐 这三个函数通过返回的指针变量标识所生成的区域将被第二步所应用。这些函数在Delphi中的函数声明及参数含义说明如下: 源代码网推荐 源代码网推荐 (1)椭圆形区域生成函数: 源代码网推荐 源代码网推荐 函数原形:HRGN CreateEllipticRgn(int nLeftRect,int nTopRect,int nRightRect,int nBottomRect); 源代码网推荐 源代码网推荐 参数含义: 源代码网推荐 源代码网推荐 nLeftRect,nTopRect:区域的左上角坐标; 源代码网推荐 源代码网推荐 nRightRect, nBottomRect:区域的右下角坐标; 源代码网推荐 源代码网推荐 (2)圆角矩形区域生成函数: 源代码网推荐 源代码网推荐 函数原形:HRGN CreateRoundRectRgn(int nLeftRect,int nTopRect,int nRightRect,int nBottomRect,int nWidthEllipse,int nHeightEllipse); 源代码网推荐 源代码网推荐 参数含义: 源代码网推荐 源代码网推荐 nLeftRect, nTopRect:区域的左上角坐标; 源代码网推荐 源代码网推荐 nRightRect, nBottomRect:区域的右下角坐标; 源代码网推荐 源代码网推荐 nWidthEllipse, nHeightEllipse:圆角的宽度和高度; 源代码网推荐 源代码网推荐 (3)多边形区域生成函数: 源代码网推荐 源代码网推荐 函数原形:HRGN CreatePolygonRgn(CONST POINT *lppt,int cPoints, int fnPolyFillMode); 源代码网推荐 源代码网推荐 参数含义: 源代码网推荐 源代码网推荐 Lppt:指向一个POINT类型的数组,该数组定义多边形顶点; 源代码网推荐 源代码网推荐 CPoints:定义数组中顶点数; 源代码网推荐 源代码网推荐 FnPolyFillMode:定义填充模式,可选值为ALTERNATE或WINDING。 源代码网推荐 源代码网推荐 实现第二步:将返回的HRGN类型的区域值被设置窗口区域函数调用。 源代码网推荐 源代码网推荐 设置窗口区域函数: 源代码网推荐 源代码网推荐 函数原形:int SetWindowRgn(HWND hWnd, HRGN hRgn, BOOL bRedraw); 源代码网推荐 源代码网推荐 参数说明: 源代码网推荐 源代码网推荐 hWnd:指向所操作的窗口的句柄; 源代码网推荐 源代码网推荐 hRgn:所给区域句柄; 源代码网推荐 源代码网推荐 bRedraw:是否显示重画窗口的标志。 源代码网推荐 源代码网推荐 在每一个函数的最后都需要调用SetWindowRgn函数,然后由Windows操作系统实现区域的各种形状的设置并显示。 源代码网推荐 源代码网推荐 以下将测试的FORM的整个源代码列出,在FORM上添加了四个按钮分别控制实现:椭圆形,圆角矩形,等边多边形和星形;一个Tpanel控件为了演示TWINcontrol类的后裔的区域定义和控制;一个SpinEdit控件定义多边形和星形的顶点连接数目。 源代码网推荐 源代码网推荐 源程序: 源代码网推荐 源代码网推荐 unit form_statue; 源代码网推荐 源代码网推荐 interface 源代码网推荐 源代码网推荐 uses 源代码网推荐 源代码网推荐 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 源代码网推荐 源代码网推荐 StdCtrls, ExtCtrls, Spin; 源代码网推荐 源代码网推荐 type 源代码网推荐 源代码网推荐 TForm1 = class(TForm) 源代码网推荐 源代码网推荐 Button1: TButton; 源代码网推荐 源代码网推荐 SpinEdit1: TSpinEdit; 源代码网推荐 源代码网推荐 Panel1: TPanel; 源代码网推荐 源代码网推荐 Button2: TButton; 源代码网推荐 源代码网推荐 Button3: TButton; 源代码网推荐 源代码网推荐 Button4: TButton; 源代码网推荐 源代码网推荐 procedure DrawRndRectRegion(wnd : HWND; rect : TRect); 源代码网推荐 源代码网推荐 procedure DrawEllipticRegion(wnd : HWND; rect : TRect); 源代码网推荐 源代码网推荐 procedure DrawPolygonRegion(wnd : HWND; rect : TRect; NumPoints : Integer; DoStarShape : Boolean); 源代码网推荐 源代码网推荐 procedure Button1Click(Sender: TObject); 源代码网推荐 源代码网推荐 procedure Button4Click(Sender: TObject); 源代码网推荐 源代码网推荐 procedure Button3Click(Sender: TObject); 源代码网推荐 源代码网推荐 procedure Button2Click(Sender: TObject); 源代码网推荐 源代码网推荐 private 源代码网推荐 源代码网推荐 { Private declarations } 源代码网推荐 源代码网推荐 rgn : HRGN; 源代码网推荐 源代码网推荐 rect : TRect; 源代码网推荐 源代码网推荐 public 源代码网推荐 源代码网推荐 { Public declarations } 源代码网推荐 源代码网推荐 end; 源代码网推荐 源代码网推荐 var 源代码网推荐 源代码网推荐 Form1: TForm1; 源代码网推荐 源代码网推荐 implementation 源代码网推荐 源代码网推荐 {$R *.DFM} 源代码网推荐 源代码网推荐 procedure TForm1.DrawRndRectRegion(wnd : HWND; rect : TRect); 源代码网推荐 源代码网推荐 begin 源代码网推荐 源代码网推荐 rgn := CreateRoundRectRgn(rect.left, rect.top, rect.right, rect.bottom, 30, 30); 源代码网推荐 源代码网推荐 SetWindowRgn(wnd, rgn, TRUE); 源代码网推荐 源代码网推荐 end; 源代码网推荐 源代码网推荐 procedure TForm1.DrawEllipticRegion(wnd : HWND; rect : TRect); 源代码网推荐 源代码网推荐 begin 源代码网推荐 源代码网推荐 rgn := CreateEllipticRgn(rect.left, rect.top, rect.right, rect.bottom); 源代码网推荐 源代码网推荐 SetWindowRgn(wnd, rgn, TRUE); 源代码网推荐 源代码网推荐 end; 源代码网推荐 源代码网推荐 procedure TForm1.DrawPolygonRegion(wnd : HWND; rect : TRect; NumPoints : Integer; DoStarShape : Boolean); 源代码网推荐 源代码网推荐 const 源代码网推荐 源代码网推荐 RadConvert = PI/180; 源代码网推荐 源代码网推荐 Degrees = 360; 源代码网推荐 源代码网推荐 MaxLines = 100; 源代码网推荐 源代码网推荐 var 源代码网推荐 源代码网推荐 x, y, 软件开发网 www.mscto.com 源代码网推荐 源代码网推荐 xCenter, 源代码网推荐 源代码网推荐 yCenter, 源代码网推荐 源代码网推荐 radius, 源代码网推荐 源代码网推荐 pts, 源代码网推荐 源代码网推荐 I : Integer; 源代码网推荐 源代码网推荐 angle, 源代码网推荐 源代码网推荐 rotation: Extended; 源代码网推荐 源代码网推荐 arPts : Array[0..MaxLines] of TPoint; 源代码网推荐 源代码网推荐 begin 源代码网推荐 源代码网推荐 xCenter := (rect.Right - rect.Left) div 2; 源代码网推荐 源代码网推荐 yCenter := (rect.Bottom - rect.Top) div 2; 源代码网推荐 源代码网推荐 if DoStarShape then 源代码网推荐 源代码网推荐 begin 源代码网推荐 源代码网推荐 rotation := Degrees/(2*NumPoints); 源代码网推荐 源代码网推荐 pts := 2 * NumPoints; 源代码网推荐 源代码网推荐 end 源代码网推荐 源代码网推荐 else 源代码网推荐 源代码网推荐 begin 源代码网推荐 源代码网推荐 rotation := Degrees/NumPoints; //得到每个顶点的度数 源代码网推荐 源代码网推荐 pts := NumPoints ; 源代码网推荐 源代码网推荐 end; 源代码网推荐 源代码网推荐 radius := yCenter; 源代码网推荐 源代码网推荐 for I := 0 to pts - 1 do begin 源代码网推荐 源代码网推荐 if DoStarShape then 源代码网推荐 源代码网推荐 if (I mod 2) = 0 then 源代码网推荐 源代码网推荐 radius := Round(radius/2) 源代码网推荐 源代码网推荐 else 源代码网推荐 源代码网推荐 radius := yCenter; 源代码网推荐 源代码网推荐 angle := ((I * rotation) 90) * RadConvert; 源代码网推荐 源代码网推荐 x := xCenter Round(cos(angle) * radius); 源代码网推荐 源代码网推荐 y := yCenter - Round(sin(angle) * radius); 源代码网推荐 源代码网推荐 arPts[I].X := x; 源代码网推荐 源代码网推荐 arPts[I].Y := y; 源代码网推荐 源代码网推荐 end; 源代码网推荐 源代码网推荐 rgn := CreatePolygonRgn(arPts, pts, WINDING); 源代码网推荐 源代码网推荐 SetWindowRgn(wnd, rgn, TRUE); 源代码网推荐 源代码网推荐 end; 源代码网推荐 源代码网推荐 procedure TForm1.Button1Click(Sender: TObject); 源代码网推荐 源代码网推荐 begin 源代码网推荐 源代码网推荐 DrawRndRectRegion(Form1.Handle, Form1.ClientRect); 源代码网推荐 源代码网推荐 end; 源代码网推荐 源代码网推荐 procedure TForm1.Button4Click(Sender: TObject); 源代码网推荐 源代码网推荐 begin 源代码网推荐 源代码网推荐 DrawPolygonRegion(Panel1.Handle, Panel1.BoundsRect, SpinEdit1.Value, True); 源代码网推荐 源代码网推荐 end; 源代码网推荐 源代码网推荐 procedure TForm1.Button3Click(Sender: TObject); 源代码网推荐 源代码网推荐 begin 源代码网推荐 源代码网推荐 DrawEllipticRegion(Form1.Handle, Form1.ClientRect); 源代码网推荐 源代码网推荐 end; 源代码网推荐 源代码网推荐 procedure TForm1.Button2Click(Sender: TObject); 源代码网推荐 源代码网推荐 begin 源代码网推荐 源代码网推荐 DrawPolygonRegion(Panel1.Handle, Panel1.BoundsRect, SpinEdit1.Value, False); 源代码网推荐 源代码网推荐 end; 源代码网推荐 源代码网推荐 end. 源代码网推荐 源代码网推荐 源程序在PWIN98 DELPHI5环境下调试成功,可以直接引用。 源代码网推荐 源代码网供稿. |
