[返回]
中国计算机报2000年第55期

Delphi中实现多程序图标一法

韩世伟

  在Delphi中我们可以静态或动态地创建窗体,所谓静态创建窗体是指在设计程序时一并建好窗体,动态创建是指在程序运行时根据需要使用Create方法创建新窗体,然后使用Show方法来显示窗体。但令人遗憾的是,在显示非启动窗体时,不论用户在程序中创建多少个窗体,每个应用程序只能有一个程序图标,在Windows的任务条上只显示一个程序图标。

  在编写应用程序时,有时我们需要同一应用程序显示两个程序图标,那么如何实现呢?我们只需重载窗体的CreateParams过程即可实现,下面以一个示例来说明如何使用。


  一、应用实例


  在Delphi集成环境中创建两个窗体,其中窗体一为主窗体,即程序启动窗体,在其上添加显示窗体二的按钮。因为要让窗体显示的同时在任务栏上再显示一个程序图标,为了区别,将窗体二的图标更换,然后在窗体二的private部分声明重载CreateParams过程:

  unit Unit2;

  ……

  private

  { Private declarations }

  procedure CreateParams(var Params: TCreateParams); override;

  最后在单元文件的实现部分(Implementation)添加重载过程的实现代码:

  procedure TForm2.CreateParams(VAR Params: TCreateParams);

  begin

   Inherited CreateParams(Params);

   Params.WndParent := GetDesktopWindow;

  end;

  运行程序中,当按下启动窗体中的“显示窗口二”按钮时,会显示窗体二,并且在Windows的任务栏上同时会出现一个新的程序图标,如图1所示。


  二、程序分析


  当程序需要创建一个窗体、向系统发出要创建一个新窗体的WM_CREATE消息时,系统将指示程序调用CreateWnd方法来创建窗体,CreateWnd方法在创建窗体前,需要调用CreateParams过程来获得窗体的初始化参数,在获得这些参数后,最后再调用CreateWindowHandle方法创建一个窗体句柄,完成了一个窗体的创建工作。因此,如果我们要使某一窗体在任务栏上显示程序图标,就需要修改窗体的初始化参数,重载CreateParams过程。

  程序窗口的初始化参数被封装成一个TCreateParams类型的对象,该类型的定义如下所示:

  type

   TCreateParams = record

   {窗体的标题文字}

   Caption: PChar;

   {窗体的类型,比如WS_CHILD 、WS_DISABLED等}

   Style: DWORD;

   {扩展的窗体类型}

   ExStyle: DWORD;

   {窗体的左上角位置}

   X, Y: Integer;

   {窗体的宽、高}

   Width, Height: Integer;

   {该窗体的父窗体句柄}

   WndParent: HWND;

   {指向WM_CREATE消息LParam参数}

   Param: Pointer

   {该类包含了一些与窗体有关的信息,如鼠标光标、选单等}

   WindowClass: TWndClass;

   {该窗体的类名}

   WinClassName: array[0..63] of Char;

   end;

  CreateParams过程是当窗体创建时执行,它初始化窗体创建的参数记录。所以如果要显示某一窗体的图标,必须要提高该窗体的级别,即将它的父窗体置为Windows的桌面,桌面的句柄可以通过API函数GetDesktopWindow来获得,因此只要我们在重载函数体中添加语句“Params.WndParent := GetDesktopWindow;”,就可以实现窗体的图标显示,正如上例所演示的那样。


  图1