情人节巨献——《爱情宝典》
编程爱好者
暗恋某个女孩(男孩)很久了吧,苦于没有恋爱经验,不敢轻易下手,怕一张嘴就遭到拒绝。眼看情人节快到了,有什么必杀技吗?本期为你介绍的《爱情宝典》介绍了大量有关求爱的高招,同时该软件也采用了一些独特的编程技巧,希望能成为你的好参谋。
本期为大家介绍的这个生活实用程序名叫《爱情宝典》,它分为男孩必读、女孩必读、恋爱技巧等七个板块。下面我们一起来看看这款软件和它的编程技巧,它采用Delphi7.0编写。
软件下载地址:http://www.cpcw.com/xz/05shenghuo.rar
一、操作方法
如图1,点击界面上方的“男孩必读”按钮后,界面中部显示此板块的第一条记录,点击界面左边的“上一条”按钮可以查看此板块的前一条记录,点击界面右边的“下一条”按钮可以查看此板块的后一条记录。

女孩必读、恋爱技巧、爱情文摘、浪漫情书、爱情故事、爱情笑话等六个板块的操作方法同上,这里不再赘述了。
二、制作难点
1.分行提示文本
把鼠标放在中间“爱情宝典”的图片上,就会出现一个特别的提示文本,如图2所示。

这种提示文本是如何制作出来的呢?其实Delphi为每个可视构件(而非快速按钮专属)都提供了Hint及ShowHint特性,其中Hint属性指定文本提示盒中的文本,而Showhint属性则决定鼠标指向构件时是否显示文本提示盒,当Showhint值为true时,显示文本提示盒。用户可在对象监视器(Objectinspector)的属性栏中设置或在程序中静态修改Hint及ShowHint属性。但Delphi提供的文本提示盒不能分行提示,而且不能改变提示盒的背景颜色,文本字型及字体都太小,既不美观亦不易看清,为此,我们需要进行一些处理:
(1)分行提示
由于Hint本身是一个字符串(string), Delphi显示该字符串时会自动处理其中的回车控制符,所以只要加上回车控制符就可以了。在Delphi中,回车控制符为“#13”,依此原理,我们还能做出别具一格的提示盒,比如等腰三角形、直角三角形等等。
procedure TForm1.FormShow(Sender: TObject);
begin
Image11.ShowHint:=true;
Image11.Hint:=' 爱'+#13+' 情'+#13+' 宝'+#13+' 典';
end;
(2)提示盒背景色的改变
Delphi在类TApplication中提供了HintColor来控制提示盒背景色,因此只要在代码中写:
Application.HintColor:= clYellow;//表示背景色为黄色
如果不使用标准的颜色,而使用浅蓝色作为背景颜色,那么怎么办呢?选择Form主窗体,双击Color属性,在弹出的颜色对话框中选择浅蓝颜色,如图3所示。

确定后图4的Clolor属性中就显示了浅蓝色的代码,用“00FF8080”代替“clYellow”。

即:Application.HintColor:=$00FF8080;
然后把Form窗体的颜色在属性中设置为默认的clBtnFace。
(3)设置提示盒的显示滞留时间,同样调用Delphi类TApplication:
Application.HintHidePause:=5000;//滞留时间设置为5000毫秒,也就是5秒
(4)设置提示盒的字体,这就需要利用Screen 对象:
Screen.HintFont.name:='楷体_GB2312' ;//设置字体为楷体
Screen.HintFont.size:=14;//设置字体大小为14
Screen.HintFont.color:=clYellow;//设置字体颜色为黄色
如果不使用标准的颜色作字体颜色,方法同设置背景颜色。
(5)经过上述设置后一个个性化的Hint就呈现在我们眼前了,源代码如下:
procedure TForm1.FormShow(Sender: TObject);
begin
Image11.ShowHint:=true;
Image11.Hint:=' 爱'+#13+' 情'+#13+' 宝'+#13+' 典';
Application.HintHidePause:=5000;
Application.HintColor:=$00FF8080;
Screen.HintFont.name:='楷体_GB2312' ;
Screen.HintFont.size:=14;
Screen.HintFont.color:=clYellow;
end;
2.透明窗体的制作
点击界面左边的“显示窗体”按钮即可把窗体全部显示出来,点击“隐藏窗体”按钮即可把窗体的空白区域剪切掉,实现透明窗体。
透明窗体的实现原理实际就是把窗体上所有控件的形状抠出来,窗体的空白区域剪切掉进行显示。
(1)首先定义两个过程:
procedure DoVisible; //显示整个窗体,包括窗体的空白区域
procedure DoInvisible; //把窗体的空白区域剪切掉,只显示窗体的可视控件
(2)定义全局变量
FullRgn, ClientRgn, CtlRgn : THandle;
(3)对显示窗体的可视控件的过程进行编码,也就视透明窗体的实现过程:
procedure TForm1.DoInvisible;
var
AControl : TControl;
A, Margin, X, Y, CtlX, CtlY : Integer;
begin
Margin := ( Width - ClientWidth ) div 2;
//取得Form区域
FullRgn := CreateRectRgn(0, 0, Width, Height);
//找到客户区
X := Margin;
Y := Height - ClientHeight - Margin;
ClientRgn := CreateRectRgn( X, Y, X + ClientWidth, Y + ClientHeight );
//遮罩客户区以外区域
CombineRgn( FullRgn, FullRgn, ClientRgn, RGN_DIFF );
//遍历窗体所有控件,于整个现存区域做OR操作
for A := 0 to ControlCount - 1 do be
gin
AControl := Controls[A];
if ( AControl is TWinControl ) or ( A
Control is TGraphicControl )
then with AControl do begin
if Visible then begin
CtlX := X + Left;
CtlY := Y + Top;
CtlRgn := CreateRectRgn( CtlX, Ct
lY, CtlX + Width, CtlY + Height );
CombineRgn( FullRgn, FullRgn, Ctl
Rgn, RGN_OR );
end;
end;
end;
//区域准备完毕,实现之
SetWindowRgn(Handle, FullRgn, TRUE);
end;
(4)对显示整个窗体的过程进行编码:
procedure TForm1.DoVisible;
begin
//恢复
FullRgn := CreateRectRgn(0, 0, Width, Height);
CombineRgn(FullRgn, FullRgn, Full
Rgn, RGN_COPY);
SetWindowRgn(Handle, FullRgn, TRUE);
end;
(5)在窗体关闭时要清空创建的区域,在窗体的OnDestroy事件中加入如下代码进行释放:
procedure TForm1.FormDestroy(Sender: TObject);
begin
//清空创建的区域
DeleteObject(ClientRgn);
DeleteObject(FullRgn);
DeleteObject(CtlRgn);
end;
编后
此软件主要向大家介绍了如何在Delphi中实现分行提示文本的制作和透明窗体的实现过程,其中透明窗体的原理虽然简单,但实现却并不算简单,需要大家多花功夫理解。