API应用秘技(13):漂亮的汉字窗口

软件世界

  本期实例效果

  在可视化开发的时代,窗体是绝大部分应用程序的核心,但是开发者也许已对Windows一成不变的方形窗体感到厌烦。其实巧妙地使用API函数即可实现汉字形状的窗体。本期的实例运行后将显示一个由“电脑报”三个汉字作为外形的窗体(如图所示)。当然你还可以利用本期讲的方法实现更有个性的汉字窗口。

  设计思路

  (1)使用BeginPath和EndPath函数为窗体定义路径。

  (2)用PathToRegion将路径转换为Region数据。

  (3)调用SetWindowRgn按路径绘制窗体。

  (4)由于不规则窗体无系统菜单,因此程序中必须有关闭窗体的代码。

  实现步骤

  启动Delphi7,新建项目。前述的API函数在Delphi中均可直接调用,因此用户不需要声明,可直接输入下面的控件事件代码。

  //窗体创建事件

  procedure TForm1.FormCreate(Sender: TObject);

  var

  rgn:HRGN;

  begin

  //设置文字颜色为红色

  form1.Color:=clred;

  //开始设置路径,参考API函数声明①

  beginpath(canvas.Handle);

  //设置背景为透明,参考API函数声明②

  setbkmode(canvas.Handle,TRANSPARENT);

  //设置字体

  canvas.Font.Name :='宋体';

  //设置字号

  canvas.Font.Size:=100;

  //将汉字“电脑报”设置为窗体形状路径

  canvas.Textout(15,15,'电脑报');

  //结束设置路径,参考API函数声明③,完成设计思路(1)

  endpath(canvas.handle);

  //将路径转换至区域,参考API函数声明④,完成设计思路(2)

  rgn:=pathtoregion(canvas.handle);

  //改变窗体形状,参考API函数声明⑤,完成设计思路(3)

  setwindowrgn(handle,rgn,true);

  end;

  //鼠标按下的事件完成,进行设计思路(4)

  procedure TForm1.FormMouseDown(Sender: TObject; Button; TMouseButton; Shift: TShiftState; X, Y: Integer);

  begin

  //如用户单击右键,则结束程序运行

  if button=mbright then

  close;

  end;

  注:本期例子在Windows2000和Delp

  hi7中测试通过。

  相关API函数声明

  ①BeginPath

  说明:该函数启动一个路径分支,此后执行的绘图命令会自动成为路径的一部分并将线段的连接进行结合,同时原有路径均会被清除。

  返回值:Long型,非零表示成功,零表示失败。

  参数:

  hdc:Long型,代表需要进行记录的设备场景。

  Delphi原型:function BeginPath; external gdi32 name 'BeginPath';

  VB声明:Declare Function BeginPath Lib "gdi32" Alias "BeginPath" (ByVal hdc As Long) As Long

  ②SetBkMode

  说明:该函数用于设置阴影刷、虚线笔及字符中的空隙填充方式。

  返回值:Long型,代表前一个背景模式的值。

  参数:

  hdc:Long型,代表设备场景的句柄。

  nBkMode:Long型,其值可为OPAQUE(用当前背景色填充虚线笔、阴影刷及字符空隙)或TRANSPARENT(透明处理)两种常量。

  Delphi原型:function SetBkMode; external gdi32 name 'SetBkMode';

  VB声明:Declare Function SetBkMode Lib "gdi32" Alias "SetBkMode" (ByVal hdc As Long, ByVal nBkMode As Long) As Long

  ③EndPath

  说明:该函数用于停止定义路径。如执行成功,从调用BeginPath函数至调用该函数间发生的所有绘图操作均成为指定设备场景的路径。

  返回值:Long型,非零表示成功,零表示失败。

  参数:

  hdc:Long型,代表需要进行记录的设备场景。

  Delphi原型:function EndPath; external gdi32 name 'EndPath';

  VB声明:Declare Function EndPath Lib "gdi32" Alias "EndPath" (ByVal hdc As Long) As Long

  ④PathToRegion

  说明:该函数将当前选择的路径转换至一个区域中。

  返回值:Long型,代表新区域句柄。如为零则表示发生错误。

  参数:

  hdc:Long型,包含需要转换路径的设备场景。

  Delphi原型:function PathToRegion; external gdi32 name 'PathToRegion';

  VB声明:Declare Function PathToRegion Lib "gdi32" Alias "PathToRegion" (ByVal hdc As Long) As Long

  ⑤SetWindowRgn

  说明:该函数用于改变窗体形状,可创建圆、星星等形状的窗体,也可将它分为多个部分,是实现汉字窗体的核心。

  返回值:Long型,执行成功为非零值,失败为零。

  参数:

  hWnd:Long型,代表需要设置区域的窗体。

  hRgn:Long型,代表需要设置区域的句柄,设置区域后,则无法使用或修改该区域句柄,也不可删除。

  bRedraw:Boolean型,如为TRUE,则设置后立即对窗体进行重画操作。

  Delphi原型:function SetWindowRgn; external user32 name 'SetWindowRgn';

  VB声明:Declare Function SetWindowRgn Lib "user32" Alias "SetWindowRgn" (ByVal hWnd As Long, ByVal hRgn As Long,ByVal bRedraw As Boolean) As Long