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

做一个软件的启动画面,关键是要将放在窗体上的位图部分显示出来,而将其它的部分隐藏,以此来达到具有自己特色的软件启动画面。下面我们以Delphi为例向大家介绍如何做一个软件的启动画面。
  #1 1.程序中函数简介
   TBitmap.Mask(TransparentColor:TColor)
   Mask函数把位图转换成单色位图,用白色来替代指定的透明色(TransparentColor),其余颜色用黑色来替代。
   TBitmap.Scanline[Row:Integer]:Pointer
   通过Scanline[Row]属性可获得位图第Row行扫描线的指针。
   BeginPath(HDC hdc)、EndPath(HDC hdc)、CloseFigure(HDC hdc)
   BeginPath函数在指定的设备上下文(Device context)中打开路径,EndPath函数关闭该路径,CloseFigure函数通过把终点和起点连成直线来关闭路径。这三个函数中的hdc是指设备上下文句柄(Handle to device context),程序中调用的是TBitmap.Canvas.Handle。
   PathToRegion(HDC hdc)
   PathToRegion函数把路径转换成区域。
   CreateRegion(SourceBmp: TBitmap; MyTransparentColor:TColor):HRGN;

CreateRegion函数把透明位图转换成区域,返回值为区域的句柄。其中SourceBmp为要转换的位图,MyTransparentColor为指定的透明色。
  #1 2.程序清单
   unit bmptorgn

{将程序定义为一个独立的单元(Unit),这样在需要调用CreateRegion函数单元的Uses语句中加上Bmptorgn即可。}

interface
   uses
   Windows,Graphics;

function CreateRegion(SourceBmp:TBitmap;MyTransparentColor:TColor):HRGN;

implementation
   function CreateRegion(SourceBmp:TBitmap;MyTransparentColor:TColor):HRGN;
   var
   offbyte,lineaddress,x,y:integer;

isline:boolean;{画线标志,"true"表示开始画线,"false"表示终止画线}

bmp:tbitmap;{程序中使用的单色位图}

Cx,Cy:integer;{线的起点}

bitcolor:byte;{点(x,y)处的颜色}

begin
   bmp:=Tbitmap.create;

bmp.assign:sourcebmp;

with bmp;bmp.canvas do begin
   mask(MyTransparentColor);

Monochrome:=true;设置为单色位图}

pixelformat:=pf1bit;

BeginPath(handle);

for y:=0 to Height-1 do begin
   lineaddress:=longint(scanline[y]);

isline:= false;

for x:=0 to Width-1 do begin;
   offbyte:=(x shr 3);点(x,y)处的颜色值在第y行扫描线中的偏移字节数}

bitcolor:=((Pbyte(lineaddress+offbyte)^shl(x-(offbyte shl 3)))and $80);{将点(x.y)处的颜色值移到最高位,然后和$80进行与计算,结果为0时是黑色,128则为白色。bitcolor的值也可采用canvas.pixel(x,y),但运行速度比采用Scanline方法的慢}

if bitcolor=0 then begin
   if not isline then begin
   isline:= true;

Cx:= x;

Cy:= y;

end;

if x=Width-1 then begin
   MoveTo(Cx,Cy);

LineTo(Width,cy);

LineTo(Width,Cy+1);

LineTo(Cx,Cy+1);

CloseFigure(handle);

end;

end else if isline then begin
   isline:= false;

MoveTo(Cx,Cy);

LineTo(Width,cy);

LineTo(Width,Cy+1);

LineTo(Cx,Cy+1);

CloseFigure(handle);

end;

end;
   end;

EndPath(handle);
   result:= PathToRegion(handle);

end;

bmp.free;

end;

end.
  #1 3.例程
   该程序的主窗口包括一个Timage控件,Form1、Image1的Autosize属性均为“True”。Image1所包含位图的背景颜色为$40ffff。
   程序清单如下:
   unit main;

interface
   uses
   Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,ExtCtrls,bmptorgn;

type
   TForm1 = class(TForm)
   Image1:TImage;

procedure FormCreate(Sender:TObject);

procedure FormCreate(Sender:TObject);

private
  
{Private declarations}

public
  
{Private declarations}

end;

var
   Form1:TForm1;

implementation
  
{$R*.DFM}

procedure TForm1.FormCreate(Sender:TOb-ject);

var myrgn:HRGN;

begin
   myrgn:=CreateRegion(image1.picture.bitmap,$40ffff);

offsetrgn(myrgn,clientorigin.x-left,clientorigin.y-top);{将区域移到窗口的客户区(Client area)}

setwindowrgn(handle,myrgn,true);{设置窗口区域}

end;

procedure TForm1.Image1Click(Sender:TOb-ject);

begin
   close;{由于没有标题栏,所以采用该方法退出程序}

end;

end.
   注:程序在Windows98 Delphi5下运行通过。