-
c语言入门之用BCB开发控制面板程序
前不久,Inprise公司(原Borland公司)正式公布了Delphi 5.0版,其开发向导中支持了"控制面板程序(CPL)"框架的生成,利用它可以快速、方便地开发CPL程序。那么是否能在现有的Borland C++ Builder 4.0中开发CPL程序呢?
CPL程序是动态链接库(DLL)的一种变形,只不过扩展名为.cpl、入口函数为CPlApplet()而不是DllEntryPoint()罢了(并不是不要DllEntryPoint(),不然不能编译)。我们只需在BCB4.0中选择"File|New..."打开开发向导,选择"DLL"生成一个DLL框架,并在其中加入一个函数CPlApplet()就可以了。为了快速地说明问题,笔者先给出一个最简单的例子程序,然后再来解说。
#include <vcl.h>
#include <cpl.h>
#include <cplext.h>
#pragma hdrstop
USERES("my.res");//这是我加入的资源文件,其中有一个图标
extern"C" __declspec(dllexport) long CALLBACK __stdcall CPlApplet(HWND hwndCPL,UINT uMsg,LPARAM lParam1,LPARAM lParam2);
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
return 1;
}
long CALLBACK __declspec(dllexport) __stdcall CPlApplet(HWND hwndCPL,UINT uMsg,LPARAM lParam1,LPARAM lParam2)
{
LPNEWCPLINFO mycpl;//LPNEWCPLINFO结构可在CPL.H头文件中查看
long result=0;
switch (uMsg)//判断传来的信息
{
case CPL_INIT:// 第一个信息,在控制面板调入时产生
result=1;
break;
case CPL_GETCOUNT://第二个信息,在控制面板调入时产生
result=1;
break;
case CPL_INQUIRE://第三个信息,当控制面板查询时产生
result=0;
break;
case CPL_NEWINQUIRE://第三个信息,当控制面板查询时产生
mycpl=LPNEWCPLINFO (lParam2);// 将lParam2中的指针传给mycpl
mycpl->dwSize=sizeof(NEWCPLINFO);
mycpl->dwFlags=0;//标志变量 一般设为0
mycpl->dwHelpContext=0;//帮助句柄一般设为0
mycpl->lData=0;
mycpl->hIcon=(HICON)LoadIcon(HInstance,"MyIcon");
mycpl->szHelpFile[0]='\0';//帮助文件
StrCopy(mycpl->szName,"BCB控制面板演示程序");//在图标下显示的说明文字
StrCopy(mycpl->szInfo,"用BCB开发自己的控制面板程序");// 在控制面板状态栏中显示的说明信息
result=0;
break;
case CPL_DBLCLK://当图标被双击时
ShowMessage("这是一个CPL试验程序");
result=0;
break;
case CPL_STOP://当用户关闭自已的程序时产生
result=1;
break;
case CPL_EXIT:// 当控制面板关闭时产生,系统使用FreeLibrary()释放
result=0;
break;
default:
break;
}
return result;
}
程序解说
CPL程序的运行流程是基于发送到程序的一系列消息。
当用户打开"控制面板"的时候,系统将遍历System目录下的所有CPL程序,并给它们传送CPL-INT消息。这时,CPL程序就可以做一些初始化工作,然后返回非零值,如果返零,程序将被终止。如果CPL-INT消息处理完成后,CPL程序将接收到CPL-GETCOUNT消息,此时程序必须返回对话框的数目,一般为1。然后,程序又将收到CPL-NEWINQUIRE消息,此时系统需要CPL程序提供有关信息,如图标、说明文字、帮助文件等,程序必须填充lParam2这个指针指向的信息结构,然后返回0。到这里,控制面板就完成了初始化,显示出各个图标。如果用户双击了某个图标后,这个图标所代表的CPL程序将接收到一个CPL-DBCLICK消息。这时,CPL程序可以显示出对话界面,进行有关操作。当用户完成操作、关闭程序时,必须返回0。当用户关闭"控制面板",此时CPL程序将接收到CPL-STOP消息,这时就要释放内存资源,做好善后工作,然后返回1。 最后CPL程序将接收到最后一个消息CPL-EXIT,系统将删除各个窗口,并使用FreeLibrary()函数将CPL程序从系统中删除,完成整个流程。一般情况下,我们只需要对CPL-NEWINQUIRE和CPL-DBCLICK这两个消息进行处理,其它的消息只要返回默认值就够了。
大家只要编译这个CPL项目,并将结果拷贝到Windows\System目录下,然后打开"控制面板"就可以看到成果了。双击图标,程序将弹出一个信息框:"这是一个CPL试验程序!"。这样一个CPL程序就完成了。
如果你想加入更多的功能,只需将CPL-DBCLICK消息进行处理,比如可以显示一个窗口进行交互操作。具体的方法与在DLL中加入窗口的方法相同,因为CPL程序本身就是基于DLL框架制作出来的。下图是笔者做的一个交互窗口:最后,告诉读者一点技巧:想要编译器输出.cpl文件,可在Project|Options...|Application|output settings中将输出扩展名dll改为cpl就行了。将CPL程序拷入Windows\System\目录下后不必打开"控制面板",直接双击文件就可以打开这个程序了。而在其它目录下是没有作用的。
CPL程序是动态链接库(DLL)的一种变形,只不过扩展名为.cpl、入口函数为CPlApplet()而不是DllEntryPoint()罢了(并不是不要DllEntryPoint(),不然不能编译)。我们只需在BCB4.0中选择"File|New..."打开开发向导,选择"DLL"生成一个DLL框架,并在其中加入一个函数CPlApplet()就可以了。为了快速地说明问题,笔者先给出一个最简单的例子程序,然后再来解说。
#include <vcl.h>
#include <cpl.h>
#include <cplext.h>
#pragma hdrstop
USERES("my.res");//这是我加入的资源文件,其中有一个图标
extern"C" __declspec(dllexport) long CALLBACK __stdcall CPlApplet(HWND hwndCPL,UINT uMsg,LPARAM lParam1,LPARAM lParam2);
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
return 1;
}
long CALLBACK __declspec(dllexport) __stdcall CPlApplet(HWND hwndCPL,UINT uMsg,LPARAM lParam1,LPARAM lParam2)
{
LPNEWCPLINFO mycpl;//LPNEWCPLINFO结构可在CPL.H头文件中查看
long result=0;
switch (uMsg)//判断传来的信息
{
case CPL_INIT:// 第一个信息,在控制面板调入时产生
result=1;
break;
case CPL_GETCOUNT://第二个信息,在控制面板调入时产生
result=1;
break;
case CPL_INQUIRE://第三个信息,当控制面板查询时产生
result=0;
break;
case CPL_NEWINQUIRE://第三个信息,当控制面板查询时产生
mycpl=LPNEWCPLINFO (lParam2);// 将lParam2中的指针传给mycpl
mycpl->dwSize=sizeof(NEWCPLINFO);
mycpl->dwFlags=0;//标志变量 一般设为0
mycpl->dwHelpContext=0;//帮助句柄一般设为0
mycpl->lData=0;
mycpl->hIcon=(HICON)LoadIcon(HInstance,"MyIcon");
mycpl->szHelpFile[0]='\0';//帮助文件
StrCopy(mycpl->szName,"BCB控制面板演示程序");//在图标下显示的说明文字
StrCopy(mycpl->szInfo,"用BCB开发自己的控制面板程序");// 在控制面板状态栏中显示的说明信息
result=0;
break;
case CPL_DBLCLK://当图标被双击时
ShowMessage("这是一个CPL试验程序");
result=0;
break;
case CPL_STOP://当用户关闭自已的程序时产生
result=1;
break;
case CPL_EXIT:// 当控制面板关闭时产生,系统使用FreeLibrary()释放
result=0;
break;
default:
break;
}
return result;
}
程序解说
CPL程序的运行流程是基于发送到程序的一系列消息。
当用户打开"控制面板"的时候,系统将遍历System目录下的所有CPL程序,并给它们传送CPL-INT消息。这时,CPL程序就可以做一些初始化工作,然后返回非零值,如果返零,程序将被终止。如果CPL-INT消息处理完成后,CPL程序将接收到CPL-GETCOUNT消息,此时程序必须返回对话框的数目,一般为1。然后,程序又将收到CPL-NEWINQUIRE消息,此时系统需要CPL程序提供有关信息,如图标、说明文字、帮助文件等,程序必须填充lParam2这个指针指向的信息结构,然后返回0。到这里,控制面板就完成了初始化,显示出各个图标。如果用户双击了某个图标后,这个图标所代表的CPL程序将接收到一个CPL-DBCLICK消息。这时,CPL程序可以显示出对话界面,进行有关操作。当用户完成操作、关闭程序时,必须返回0。当用户关闭"控制面板",此时CPL程序将接收到CPL-STOP消息,这时就要释放内存资源,做好善后工作,然后返回1。 最后CPL程序将接收到最后一个消息CPL-EXIT,系统将删除各个窗口,并使用FreeLibrary()函数将CPL程序从系统中删除,完成整个流程。一般情况下,我们只需要对CPL-NEWINQUIRE和CPL-DBCLICK这两个消息进行处理,其它的消息只要返回默认值就够了。
大家只要编译这个CPL项目,并将结果拷贝到Windows\System目录下,然后打开"控制面板"就可以看到成果了。双击图标,程序将弹出一个信息框:"这是一个CPL试验程序!"。这样一个CPL程序就完成了。
如果你想加入更多的功能,只需将CPL-DBCLICK消息进行处理,比如可以显示一个窗口进行交互操作。具体的方法与在DLL中加入窗口的方法相同,因为CPL程序本身就是基于DLL框架制作出来的。下图是笔者做的一个交互窗口:最后,告诉读者一点技巧:想要编译器输出.cpl文件,可在Project|Options...|Application|output settings中将输出扩展名dll改为cpl就行了。将CPL程序拷入Windows\System\目录下后不必打开"控制面板",直接双击文件就可以打开这个程序了。而在其它目录下是没有作用的。
最新更新
Objective-C语法之代码块(block)的使用
VB.NET eBook
Add-in and Automation Development In VB.NET 2003 (F
Add-in and Automation Development In VB.NET 2003 (8
Add-in and Automation Development in VB.NET 2003 (6
Add-in and Automation Development In VB.NET 2003 (5
AddIn Automation Development In VB.NET 2003 (4)
AddIn And Automation Development In VB.NET 2003 (2)
Addin and Automation Development In VB.NET 2003 (3)
AddIn And Automation Development In VB.NET 2003 (1)
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
武装你的WEBAPI-OData入门
武装你的WEBAPI-OData便捷查询
武装你的WEBAPI-OData分页查询
武装你的WEBAPI-OData资源更新Delta
5. 武装你的WEBAPI-OData使用Endpoint 05-09
武装你的WEBAPI-OData之API版本管理
武装你的WEBAPI-OData常见问题
武装你的WEBAPI-OData聚合查询
OData WebAPI实践-OData与EDM
OData WebAPI实践-Non-EDM模式