ImageVerifierCode 换一换
格式:DOCX , 页数:9 ,大小:17.68KB ,
资源ID:27018546      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/27018546.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(windows异性窗体.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

windows异性窗体.docx

1、windows异性窗体windows异性窗体WINDOWS图形界面应用程序都是基于窗口的。在Windows操作系统中,窗口是应用程序与用户之间的界面。微软对窗口的定义是:窗口是屏幕上的一块方形部分,用来显示输出和接受用户的输入。编写基于Windows 的GUI程序首先要做的事情之一便是创建一个或多个窗口。我们通常使用CreateWindow和CreateWindowEx这两个API函数创建窗口,此外通过DialogBox,CreateDialog和MessageBox等函数还可以创建特殊用途的窗口(如对话框、消息框等)。 不管是以上哪个函数,都将无一例外的得到矩形窗口。但是,有时为了实现特殊效

2、果,有时希望使用不规则形状的窗口。而本文就将探讨怎样实现这些异形窗口,如圆形、椭圆形、星形等窗口。 为了实现不规则形状的窗口,需要用到“区域”(Region)这一概念。在微软Windows操作系统中,区域是指能对其进行填充、绘制、加边框、颜色翻转等操作的长方形、(椭)圆形、多边形,或者这些形状的叠加。 区域的创建 通过以下API函数,我们可以创建区域,它们是:CreateRectRgn(长方形),CreateRoundRectRgn(圆角长方形),CreateEllipticRgn(圆形和椭圆形),以及CreatePolygonRgn和CreatePolyPolygonRgn。如果调用成功的话

3、,它们都会返回一个指向新建区域的句柄。下面先简单地介绍CreatePolygonRgn和CreateEllipticRgn的用法: HRGN CreatePolygonRgn( /创建多边形区域 CONST POINT *lppt, /指向一个POINT类型的数组 int cPoints, /数组中元数的个数 int fnPolyFillMode /多边形填充模式 ); HRGN CreateEllipticRgn( /创建圆形或者椭圆形区域 int nLeftRect, /(椭)圆外切长方形左上角的X坐标 int nTopRect, /(椭)圆外切长方形左上角的Y坐标 int nRightR

4、ect, /(椭)圆外切长方形右下角的X坐标 int nBottomRect /(椭)圆外切长方形右下角的Y坐标 ); 区域的一个非常重要的性质是:任意两个区域可以进行合成操作,进而生成一个新的区域。 区域的合成 利用已有的区域可以合成新的区域,这便是函数CombineRgn的作用。该函数的C语言原型声明如下: int CombineRgn( HRGN hrgnDest, / 指向目的区域 HRGN hrgnSrc1, / 指向源区域 HRGN hrgnSrc2, / 指向源区域 int fnCombineMode / 区域结合模式 ); 在上述函数中,第二、三个参数为源区域;第一个参数hrg

5、nDest指向的是目的区域,这块区域将用来盛放由hrgnSrc1和hrgnSrc2合成的新区域,所以必须保证hrgnDest所指向的区域在调用函数CombineRgn之前已经存在。 第四个参数,即fnCombineMode,指明了合成方式,它的取值及含义如表1所示: 表1 合成方式 含 义 RNG_AND 新区域为两块源区域的相交部分。 RNG_COPY 新区域为第一块源区域的拷贝。 RNG_DIFF 新区域为第一块源区域减去与第二块源区域共有的部分。 RNG_OR 新区域为两块源区域的并集。 RNG_XOR 新区域为两块源区域的非公共部分的并集。 区域的使用 创建或者合成了一定形状的区域之后

6、,并不能看到任何东西。区域要与具体的窗口结合才能起作用。把区域同窗口挂起钩来,要用到名为SetWindowRgn的API函数。它的原型如下: int SetWindowRgn( HWND hWnd, / 指向窗口区域已被设定好的窗口 HRGN hRgn, / 指向区域 BOOL bRedraw / 窗口重画标志 ); 当成功地调用了此函数后,操作系统将拥有hRgn所指定的那块区域。区域的坐标是相对于窗口的左上角(包括标题区在内)。窗口中只有在区域内的那部分是可见的,对位于区域之外的窗口部分,系统将不予显示。也就是说,窗口表现出来的形状与区域的形状是一样的(当然这还有个条件,那就是窗口不得比区域

7、小)。为了调整窗口的大小,可先用API函数GetRgnBox获取区域的大小(即长与宽),再根据获得的数据(在p2中)来相应地调整窗口的长和宽: function GetRgnBox(RGN: HRGN; var p2: TRect): Integer; stdcall; 有了上面介绍的这些关于区域的知识,就足以实现这些异形窗口了。 异形窗口示例程序 笔者用Delphi编写了一个示例程序,它实现了5种形状的窗口(图1中列出了其中四种)。希望该示例程序能有助于读者加深对区域的理解和运用。 以下是程序的主单元代码: /Create windows in special shapes. /Press

8、CTRL+S to exit this program. unit Shapes; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; const HOTKEYID=1; type TShape = class(TForm) Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure

9、 Timer1Timer(Sender: TObject); private procedure WMHOTKEY(var Msg:TWMHotKey);message WM_HOTKEY; end; var Tick:Integer; Shape: TShape; Rgn, Rgn1:THandle; XX,YY:Integer; Triangle:array0.2 of TPoint =(x:30;y:0),(x:0;y:60),(x:60;y:60); Diamond:array0.3 of TPoint =(x:30;y:0),(x:60;y:50),(x:30;y:100),(x:0

10、;y:50); Star:array0.4of TPoint=(x:34;y:0), (x:0;y:73), (x:75;y:28),(x:3;y:28),(x:64;y:73); implementation $R *.DFM procedure TShape.FormCreate(Sender: TObject); begin Timer1.Interval:=99; BorderStyle:=bsNone; 下条语句将Application窗口的扩展风格重新设 为WS_EX_TOOLWINDOW,这样程序运行时就不会在 任务栏上出现一个小图标。 Timer1Timer(self); Se

11、tWindowLong(Application.Handle,GWL_ExStyle,WS_EX_ToolWindow); /为窗口注册Ctr+S 热键 RegisterHotKey(Handle,HOTKEYID,MOD_CONTROL,ord(S); end; procedure TShape.FormDestroy(Sender: TObject); begin DeleteObject(Rgn); UnregisterHotKey(Handle,HOTKEYID); end; procedure TShape.WMHOTKEY(var Msg:TWMHotKey); begin /检测

12、到Ctrl+S 热键时退出程序 if (Msg.HotKey=HOTKEYID) then Close else inherited; end; procedure TShape.Timer1Timer(Sender: TObject); var Rect:TRect; cl:Integer; begin Randomize; cl:=Random($2FFFFFFF); Tick:=Tick mod 300; /每隔一定时间变换一次形状 case Tick of 0:/五星形 begin Rgn:=CreatePolygonRgn(Star,5,0); SetWindowRgn(Handle

13、,Rgn,TRUE); GetRgnBox(Rgn,Rect); Width:=Rect.Right-Rect.Left; Height:=Rect.Bottom-Rect.Top; Color:=cl; end; 60:/圆形 begin Rgn:=CreateEllipticRgn(0,0,60,60); SetWindowRgn(Handle,Rgn,TRUE); GetRgnBox(Rgn,Rect); Width:=Rect.Right-Rect.Left; Height:=Rect.Bottom-Rect.Top; Color:=cl; end; 120:/圆环形 begin Rg

14、n:=CreateEllipticRgn(0,0,60,60); Rgn1:=CreateEllipticRgn(15,15,45,45); CombineRgn(Rgn,Rgn,Rgn1,RGN_XOR); DeleteObject(Rgn1); SetWindowRgn(Handle,Rgn,TRUE); GetRgnBox(Rgn,Rect); Width:=Rect.Right-Rect.Left; Height:=Rect.Bottom-Rect.Top; Color:=cl; end; 180:/棱形 begin Rgn:=CreatePolygonRgn(Diamond,4,0)

15、; SetWindowRgn(Handle,Rgn,TRUE); GetRgnBox(Rgn,Rect); Width:=Rect.Right-Rect.Left; Height:=Rect.Bottom-Rect.Top; Color:=cl; end; 240:/三角形 begin Rgn:=CreatePolygonRgn(Triangle,3,0); SetWindowRgn(Handle,Rgn,TRUE); GetRgnBox(Rgn,Rect); Width:=Rect.Right-Rect.Left; Height:=Rect.Bottom-Rect.Top; Color:=cl; end; end;/case inc(Tick); if LeftScreen.Width-Width then XX:=-Random(20) else if Left if TopScreen.Height-Height then YY:=-Random(20) else if Top if (XX-3)and(XX if (YY-3)and(YY /移动窗口 SetWindowPos(Handle,HWND_TOPMOST,Left+XX,Top+YY,Width,Height,SWP_NOACTIVATE); end; end.

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1