Go homepage(回首页) Upload pictures (上传图片) Write articles (发文字帖)
The author:(作者)aaapublished in(发表于) 2014/7/19 0:13:46 Delphi非矩形窗体
Delphi非矩形窗体实例说明大部分Windows窗体都是一个矩形区域,读者是否已经厌倦了这种中规中矩的矩形窗体?本实例的窗体是一个打破传统矩形窗体的异性窗体,运行该例会看到一个非常可爱的窗体,单击X按钮就会使窗体关闭,效果如图1.21图1.21非矩形窗体技术要点在Windows操作系统中,每个窗口都具有一个绘图区域,当这个区域需要绘制时,窗口会自动安装这个区域的范围绘制图像,如果在程序启动时将这个区域改变,系统就会按照改变后的区域绘制图像,这就等于改变了窗口的形状。Windows提供了一个API函数SetWindowRgn,通过这个函数可以改变窗口的区域,该函数原型如下:function SetWindowRgn(hWnd:HWND;hRgn:HRGN;bRedraw:BOOL):Integer;stdcall;参数说明:hWnd 目标窗口句柄hRgn 改变后区域bRedraw 重新绘制其中HRGN类型的参数就是窗口的新区域,这个区域可以通过很多的方法创建,本例中实现一个异形窗体,创建这个异形的区域需要从图像中截取。首先制作一副图像,在图像中绘制换一个图像,该图像就是将要截取的区域形状,图形的周围用一种特殊的颜色填充,这样可以突出于再截取的图形。然后在程序中将区域截取出来。最后将图像绘制到窗体中。这个过程中用到了CreateRgn和CombineRgn两个API函数。这两个函数的原型如下:function CreateRectRgn(p1,p2,p3,p4:Integer):HRGN;stdcall;参数说明:p1,p2,p3,p4 创建尺寸的矩形参数。function CombineRgn(p1,p2,p3,p4:HRGN;p4:Integer):Integer;stdcall;参数说明:p1,p2,p3 HRGN类型的区域。其中参数p4取值如表1.10所示表1.10 参数p4的取值。实现的过程1.新建一个标准工程,创建一个新窗体,默认主窗体的Name属性为Form1。2.在窗体中添加TSpeedButton组件。3.设置TSpeedButton组件的Flat属性为True。4.程序代码如下:procedure TForm1.FormCreate(Sender: TObject);varthreadrgn,tmprgn:HRGN;x,y,t,h:integer;beginBitmapb:=TBitMap.Create;Bitmapb.LoadFromFile('heart.bmp');threadrgn:=CreateRectRgn(0,0,bitmapb.Width,bitmapb.Height);t:=bitmapb.Height;h:=bitmapb.Width;self.Height:=t;self.Width:=h;for y:=0 to t dofor x:=0 to h doif bitmapb.Canvas.Pixels[x,y] = rgb(0,0,255) thenbegintmpRgn:=CreateRectRgn(x,y,x+1,y+1);CombineRgn(threadrgn,threadrgn,tmpRgn,RGN_XOR);DeleteObject(tmpRgn);end;SetWindowRgn(handle,Threadrgn,false);end;
赞