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;