Delphi 5快速创建控制面板程序
整理编辑:China ASP
---- Borland Delphi是深受广大软件开发人员喜爱的一种高效、快速的RAD(Rapid Application Development)开发工具。在1999年秋季发布的Delphi 5中,Delphi又引入了许多新的特色。其中之一便是Delphi 5的Enterprise和Professional版本中新增了用于快速创建控制面板(CPL)程序的向导和类,这使得我们能够在可视化开发环境中非常方便地建立控制面板应用程序。
---- 一、关于控制面板程序
---- 在Windows中,用户通过控制面板来进行增删程序、添加硬件、设置各种系统属性等操作。控制面板中所显示的小程序(或称之为对话框)是由控制面板程序(Control Panel Application)提供的。Windows本身附带了十来个控制面板应用程序,它们都位于Windows的System目录下,扩展名为*.CPL。每个控制面板中的应用程序可以有一个或多个对话框,每个对话框在控制面板中用一个图标代表。
---- 控制面板应用程序实质上是一类特殊的动态链接库,每个控制面板程序必须输出一个CPlApplet函数,它是控制面板应用程序的入口,其主要作用是处理Windows消息。CPlApplet函数的原型为:
function CPlApplet(
hwndCPl: THandle; //Identifies the main
window of the controlling application.
uMsg: DWORD; // Specifies the message
being sent to the Control Panel application
lParam1, lParam2: Longint // Specify
additional message-specific information
): Longint; stdcall;
---- CplApplet函数是控制面板与控制面板应用程序通讯的唯一方式。一个控制面板程序中的CplApplet函数的基本框架结构如下:
function CPlApplet(hwndCPl: THandle; uMsg: DWORD;
lParam1, lParam2: Longint): Longint;
begin
//…
case (uMsg) of
CPL_INIT: begin {…} end;
CPL_GETCOUNT: begin {…} end;
CPL_INQUIRE: begin {…} end;
CPL_NEWINQUIRE: begin {…} end;
CPL_DBLCLK: begin {…} end;
CPL_STOP: begin {…} end;
CPL_EXIT: begin {…} end;
CPL_STARTWPARMS: begin {…} end;
CPL_SETUP: begin {…} end;
end;
//函数的返回值取决于uMsg
end;
---- 事实上,编写控制面板程序的主要任务都放在处理这些CPL_消息上,关于这些消息的含义,请参看Delphi 5所带的帮助文档Win32.hlp。
---- 为了简化控制面板程序的创建,Delphi 5新增了一个可视化构件库CtlPanel.PAS。CtlPanel单元中定义了TAppletApplication(控制面板应用程序类)和TAppletModule类.
---- 使用TAppletApplication和TAppletModule类构造控制面板应用程序是一件非常轻松的事情。下面我来介绍一下在Delphi 5中创建控制面板程序的基本步骤。
---- 二、Delphi 5中建立控制面板程序
---- 第一步:选择File | New菜单,在New Items对话框的New页上选择Control Panel Application,Delphi将创建一个新的控制面板应用程序(其中已经包含一个applet)。Delphi向导创建的工程文件如下:
library Project1;
uses
CtlPanel,
Unit1 in 'Unit1.pas'
{AppletModule1: TAppletModule};
exports CPlApplet;
{$R *.RES}
{$E cpl}
begin
Application.Initialize;
Application.CreateForm
(TAppletModule1, AppletModule1);
Application.Run;
end.
---- 在上面的DPR文件中,Application对象的类型是TAppletApplication,而不是TApplication,它是在CtlPanel单元中申明的。而且CplApplet函数也已经由CtlPanel单元定义好了。
---- 第二步:更改AppletModule的属性
---- 一个AppletModule对象代表一个对话框(即applet),一个CPL应用程序可以包含多个对话框。你可以通过Delphi向导来增添多个AppletModule。
---- AppletIcon属性:指定一个图标,此图标将出现在控制面板中。
---- Caption属性:显示在图标下面的文字。
---- Help属性:出现在控制面板窗口的状态栏上的文字。
---- ResidIcon属性:图标资源id,此属性与AppletIcon属性互斥。
---- ResidName属性:字符串资源id,此属性与Caption属性互斥。
---- ResidInfo属性:字符串资源id,此属性与Help属性互斥。
---- 第三步:编写事件句柄
---- 在控制面板中,当鼠标双击对话框的图标时,相应的AppletModule对象会产生OnActivate事件。为了响应鼠标的双击,你需要为TAppletModule的OnActivate事件属性提供一个事件句柄。
procedure TAppletModule1.
AppletModuleActivate(Sender:
TObject; Data: Integer);
begin
MessageBox(Application.ControlPanelHandle,
'Delphi 5 is so great!', 'CPL Demo',
MB_ICONINFORMATION);
end;
---- 第四步:CPL的安装
---- 由于动态连接库工程文件中有一个{$E cpl}编译指示字,编译此DPR文件将产生一个扩展名为.CPL的文件,它就是我们所要的控制面板应用程序模块。控制面板程序的安装十分简单,只要将CPL文件拷贝到Windows的System目录(或者Windows NT的System32目录)下即可。当你再次打开控制面板时,你所编写的控制面板应用程序就会出现。
***************************************
创建"控制面板"的新项目
2000-08-14 15:11:00
当我们打开"控制面板"以后,能看到许多项目,如:系统、显示器等。不过,这些项目并非指向某些可执行的程序,其实,它们是一些特殊的动态链接库,在Windows里注册的类型是"控制面板扩展",文件的扩展名是"CPL"。
这种"控制面板扩展"与普通动态链接库(DLL)类似,但必须符合以下的要求:
1.该动态链接库必须输出一个CplApplet函数,这个函数包含了一些消息,函数的原型如下:
function CPlApplet(hwndCPL: HWND; uMsg: UINT;
lParam1: LPARAM; lParam2: LPARAM): LongInt; stdcall;
2.该动态链接库的扩展名是"CPL",位于Windows的系统目录下,通常是"\Windows\System";
3.函数CplApplet必须处理的消息包括:CPL-INIT、CPL-GETCOUNT、CPL-NEWINQUIRE、CPL-DBLCLK等:
CPL-INIT:表示程序被(控制面板)发现,返回True或False表示是否继续进行下去。
CPL-GETCOUNT:确定程序在控制面板中显示的个数,返回值为显示的个数。
CPL-NEWINQUIRE:用于填写程序的信息。
CPL-DBLCLK:当图标被双击时触发,这时可以显示一个Form。
在Delphi中新建一个工程,选择"DLL",Delphi就会自动创建一个动态链接库的框架,先把这个工程存为"myCPL.dpr",然后新建一个Form,保存为main.pas。
myCPL.dpr的内容如下:
library mycpl;
uses
Windows,
SysUtils,
CPL,
Forms,
main in ′main.pas′ {MainForm};
{$E cpl} //表示扩展名是CPL
{$R *.res}
function CPlApplet(hwndCPL: HWND; uMsg: UINT;
lParam1: LPARAM; lParam2: LPARAM) : LongInt; stdcall;
var
pNewInfo: PNewCPlInfo;
begin
case uMsg of
CPL-INIT:
begin
Result := 1;
end;
CPL-GETCOUNT:
begin
Result := 1;
end;
CPL-NEWINQUIRE:
begin
pNewInfo:=PNewCPlInfo(lParam2);
with pNewInfo^ do
begin
dwSize:=sizeof(TNewCPLInfo);
dwFlags:=0;
StrPLCopy(szName,′新建项目′, 31);
StrPLCopy(szInfo, ′我的选项′, 63);
end;
end;
CPL-DBLCLK:
begin
with TMainForm.Create(Application) do
ShowModal;
Result:=0;
end;
end;
end;
exports
CPlApplet;
begin
end.
把编译好的mycpl.cpl拷贝到Windows的System目录下后,打开"控制面板",你会发现多了一个"新建项目",用鼠标选中,窗口的状态栏显示:"我的选项"。用鼠标双击,一个Form就显示出来,剩下的事情就不用多说了。
以上程序在Windows 95、Delphi 4.0下运行通过。
摘自《赛迪网》 杨勇/文
***************************************
利用dephi5编写控制面板程序
www.applevb.com
在windows中提供了一个控制面板窗口,一个控制面板窗口就象windows的控制中心。
在窗口中有诸如 "系统"、"多媒体"图标,通过双击这些不同的图标,就可以打开不
同的控制面板程序查看系统状况和对系统进行设置了。
如何在控制面板中添加自己的控制面板程序呢?首先来了解以下控制面板程序的原
理。一个控制面板程序就是一个动态连接库(dll)。在库文件中必须建立一个名称为
cplapplet的输出回调函数,在函数中加入对windows调用的响应代码,编辑成动态连接
库文件。库文件将库文件的扩展名改为cpl,然后将文件拷贝到 windows\system子目录
下,系统在启动时会自动搜索扩展名为cpl的文件。搜索到文件之后,系统会装入文件
并调用cplapplet函数,这时函数中的代码就开始工作,执行弹出系统设置窗口等操作。
是不是很复杂,你必须对于系统调用dll的工作原理和回调函数有比较深刻的了解
才能编写控制面板程序,而且必须无法在编程软件的集成窗口中调试,而必须先编译
好以后拷贝到 windows\system 目录下观察运行效果,然后再对源程序除错,再编译。
幸好在delphi5中提供了方便建立控制面板程序的方式。在delphi5的菜单中选
file | new ,在new items窗口中会看到有一个 control panel application 选项,
点击这个选项,然后再按ok键,就可以建立一个基本的控制面板程序。在这个程序的
工程文件包中包含两个文件,一个是工程文件 project1.dpr。按ctrl+f12打开
view units窗口打开project1,可以看到代码的第一行是library project1; ,另外
在代码中还有一行:exports cplapplet; ,这说明程序已经自动建立了输出回调函数。
另一个文件是控制面板程序控制文件(姑且这么称呼它)unit1.pas。这个程序代码
中建立了一个tappletmodule类,这个类就是控制面板程序控制类。同时程序还会建立
一个调试、控制窗口appletmodule1。在窗口左边的列表框中有一项 appletmodule1,
右键点击该项,在弹出菜单中选install control panel applet项编译并安装控制面板
程序。如果安装成功,再右键点击appletmodule1,在弹出菜单中选launch control
panel运行控制面板。怎么样?在控制面板中是不是增加了一个 appletmodule1项?
当然,现在这个程序还很简单,没有漂亮的图标,双击它也没有反应,在下面我就要
介绍对这个程序的扩展。
首先要让它响应鼠标的双击。首先按shift+f12键,在view form窗口中选择appletmodule1
打开调试、控制窗口。在窗口左边的object inspector中点击events页面,在events列表
中的第一项就是onactive事件,你也许猜到了,对,这个事件就是控制面板程序被激活
(也就是你双击控制面板中的程序图标时发生的事件)时产生的事件。
下面来编写代码响应事件。在delphi菜单中选 file | new,在new items窗口中选
form项添加一个新的窗口。将文件保存为unit2.pas,然后在unit1.pas中添加
uses unit2; (该句要添加在implementation后面),在events列表中双击onactive
事件,在事件中添加如下代码:
procedure tappletmodule1.appletmoduleactivate(sender: tobject;
data: integer);
begin
with tform2.create(application) do begin
if showmodal = mrok then
free;
end;
end;
最后记住将project1中的application.createform(tform2, form2); 行给删除掉。
接下来设置程序图标,点击appletmodule1的object inspector窗口,点击properties
页面,选appleticon项,就可以为控制面板程序添加图标了。改变caption项的值就可以为
程序设置不同的标题。
图标和程序标题设置好以后,再重复上面的install control panel applet编译并
安装程序,然后再选launch control panel运行。双击新建立的程序图标,看看,建立
一个控制面板程序就是这么简单!
当然,这只是一个最简单的控制面板程序,它只是响应onactive事件并弹出一个窗口,
在onactive事件中的data是一个比较重要的参数,它是控制面板程序调用程序传递给程序
的参数,利用这个参数可以对不同的调用弹出不同的窗口,例如你要建立一个时间/日期
调整控制程序,你可以做以下代码:
procedure tappletmodule1.appletmoduleactivate(sender: tobject;
data: integer);
begin
with tform2.create(application) do begin file://以下是伪代码:
case data of
1:dochangetime; file://显示改变系统时间窗口
2:dochangedate; file://显示改变系统日期窗口
end;
end;
end;
这样当外部程序以不同的参数调用程序时,程序能弹出不同的窗口,例如 rundll32 app.cpl 1
就将弹出改变系统时间窗口。