Go homepage(回首页)
Upload pictures (上传图片)
Write articles (发文字帖)

The author:(作者)aaa
published in(发表于) 2014/7/19 0:13:46
Delphi非矩形窗体

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);

var

threadrgn,tmprgn:HRGN;

x,y,t,h:integer;

begin

Bitmapb:=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 do

for x:=0 to h do

if bitmapb.Canvas.Pixels[x,y] = rgb(0,0,255) then

begin

tmpRgn:=CreateRectRgn(x,y,x+1,y+1);

CombineRgn(threadrgn,threadrgn,tmpRgn,RGN_XOR);

DeleteObject(tmpRgn);

end;

SetWindowRgn(handle,Threadrgn,false);

end;




If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)





QQ:154298438
QQ:417480759