如何做一个软件的启动画面
#1?牐?1.程序中函数简介
?牐燭Bitmap.Mask(TransparentColor:TColor)??
?牐燤ask函数把位图转换成单色位图,用白色来替代指定的透明色(TransparentColor),其余颜色用黑色来替代。
?牐燭Bitmap.Scanline[Row:Integer]:Pointer
?牐犕ü齋canline[Row]属性可获得位图第Row行扫描线的指针。
?牐燘eginPath(HDC hdc)、EndPath(HDC hdc)、CloseFigure(HDC hdc)??
?牐燘eginPath函数在指定的设备上下文(Device context)中打开路径,EndPath函数关闭该路径,CloseFigure函数通过把终点和起点连成直线来关闭路径。这三个函数中的hdc是指设备上下文句柄(Handle to device context),程序中调用的是TBitmap.Canvas.Handle。
?牐燩athToRegion(HDC hdc)??
?牐燩athToRegion函数把路径转换成区域。
?牐燙reateRegion(SourceBmp: TBitmap; MyTransparentColor:TColor):HRGN;??
?牐燙reateRegion函数把透明位图转换成区域,返回值为区域的句柄。其中SourceBmp为要转换的位图,MyTransparentColor为指定的透明色。
#1?牐?2.程序清单
?牐爑nit bmptorgn??
?牐爗将程序定义为一个独立的单元(Unit),这样在需要调用CreateRegion函数单元的Uses语句中加上Bmptorgn即可。}??
?牐爄nterface
?牐爑ses
?牐燱indows,Graphics;??
?牐爁unction CreateRegion(SourceBmp:TBitmap;MyTransparentColor:TColor):HRGN;??
?牐爄mplementation
?牐爁unction CreateRegion(SourceBmp:TBitmap;MyTransparentColor:TColor):HRGN;
?牐爒ar
?牐爋ffbyte,lineaddress,x,y:integer;??
?牐爄sline:boolean;{画线标志,"true"表示开始画线,"false"表示终止画线}??
?牐燽mp:tbitmap;{程序中使用的单色位图}??
?牐燙x,Cy:integer;{线的起点}??
?牐燽itcolor:byte;{点(x,y)处的颜色}??
?牐燽egin
?牐燽mp:=Tbitmap.create;??
?牐燽mp.assign:sourcebmp;?牔?
?牐爓ith bmp;bmp.canvas do begin
?牐爉ask(MyTransparentColor);?牔?
?牐燤onochrome:=true;设置为单色位图}??
?牐爌ixelformat:=pf1bit;??
?牐燘eginPath(handle);??
?牐爁or y:=0 to Height-1 do begin
?牐爈ineaddress:=longint(scanline[y]);?牐牔?
?牐爄sline:= false;??
?牐爁or x:=0 to Width-1 do begin;
?牐爋ffbyte:=(x shr 3);点(x,y)处的颜色值在第y行扫描线中的偏移字节数}??
?牐燽itcolor:=((Pbyte(lineaddress+offbyte)^shl(x-(offbyte shl 3)))and $80);{将点(x.y)处的颜色值移到最高位,然后和$80进行与计算,结果为0时是黑色,128则为白色。bitcolor的值也可采用canvas.pixel(x,y),但运行速度比采用Scanline方法的慢}??
?牐爄f bitcolor=0 then begin
?牐爄f not isline then begin
?牐爄sline:= true;??
?牐燙x:= x;??
?牐燙y:= y;??
?牐爀nd;??
?牐爄f x=Width-1 then begin
?牐燤oveTo(Cx,Cy);?牔?
?牐燣ineTo(Width,cy);?牔?
?牐燣ineTo(Width,Cy+1);?牔?
?牐燣ineTo(Cx,Cy+1);?牔?
?牐燙loseFigure(handle);?牔?
?牐爀nd;??
?牐爀nd else if isline then begin
?牐爄sline:= false;??
?牐燤oveTo(Cx,Cy);??
?牐燣ineTo(Width,cy);?牔?
?牐燣ineTo(Width,Cy+1);?牔?
?牐燣ineTo(Cx,Cy+1);?牔?
?牐燙loseFigure(handle);?牔?
?牐爀nd;??
?牐爀nd;
?牐爀nd;??
?牐燛ndPath(handle);??
?牐爎esult:= PathToRegion(handle);?牐牔?
?牐爀nd;??
?牐燽mp.free;??
?牐爀nd;??
?牐爀nd.
#1?牐?3.例程
?牐牳贸绦虻闹鞔翱诎ㄒ桓鯰image控件,Form1、Image1的Autosize属性均为“True”。Image1所包含位图的背景颜色为$40ffff。
?牐牫绦蚯宓ト缦拢?
?牐爑nit main;??
?牐爄nterface
?牐爑ses
?牐燱indows,Messages,SysUtils,Classes,Graphics,Controls,Forms,ExtCtrls,bmptorgn;??
?牐爐ype
?牐燭Form1 = class(TForm)??
?牐營mage1:TImage;??
?牐爌rocedure FormCreate(Sender:TObject);?牔?
?牐爌rocedure FormCreate(Sender:TObject);?牔?
?牐爌rivate
?牐牓? {Private declarations} ??
?牐爌ublic
?牐牓煟鸓rivate declarations}??
?牐爀nd;??
?牐爒ar
?牐燜orm1:TForm1;??
?牐爄mplementation
?牐牓煟?$R*.DFM}??
?牐爌rocedure TForm1.FormCreate(Sender:TOb-ject);?牔?
?牐爒ar myrgn:HRGN;??
?牐燽egin
?牐爉yrgn:=CreateRegion(image1.picture.bitmap,$40ffff);?牔?
?牐爋ffsetrgn(myrgn,clientorigin.x-left,clientorigin.y-top);{将区域移到窗口的客户区(Client area)}?牓?
?牐爏etwindowrgn(handle,myrgn,true);{设置窗口区域}??
?牐爀nd;??
?牐爌rocedure TForm1.Image1Click(Sender:TOb-ject);?牔?
?牐燽egin
?牐燾lose;{由于没有标题栏,所以采用该方法退出程序}??
?牐爀nd;??
?牐爀nd.
?牐犠ⅲ撼绦蛟赪indows98 Delphi5下运行通过。