HanDs
管理员

[Delphi文章] 实现多程序图标一法 



在Delphi中我们可以静态或动态地创建窗体,所谓静态创建窗体是指在设计程序时一并建好窗体,动态创建是指在程序运行时根据需要使用Create方法创建新窗体,然后使用Show方法来显示窗体。但令人遗憾的是,在显示非启动窗体时,不论用户在程序中创建多少个窗体,每个应用程序只能有一个程序图标,在Windows的任务条上只显示一个程序图标。
在编写应用程序时,有时我们需要同一应用程序显示两个程序图标,那么如何实现呢?我们只需重载窗体的CreateParams过程即可实现,下面以一个示例来说明如何使用。
 
一、应用实例
 
在Delphi集成环境中创建两个窗体,其中窗体一为主窗体,即程序启动窗体,在其上添加显示窗体二的按钮。因为要让窗体显示的同时在任务栏上再显示一个程序图标,为了区别,将窗体二的图标更换,然后在窗体二的private部分声明重载CreateParams过程:
unit Unit2;
……
protected
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楼
发帖时间:2016-7-9   |   查看数:0   |   回复数:0
游客组
快速回复