如何做一个软件的启动画面

Author: 朱大勇 Date: 2001年 22期

?牐犠鲆桓鋈砑钠舳妫丶且旁诖疤迳系奈煌疾糠窒允境隼矗渌牟糠忠兀源死创锏骄哂凶约禾厣娜砑舳妗O旅嫖颐且訢elphi为例向大家介绍如何做一个软件的启动画面。
  #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下运行通过。