如何编写控制面板程式

2008-02-23 05:33:26来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

控制面板程式是用户用于配置Windows环境的一些特别动态连接库(DLL)。Windows已为我们提供了一些标准的控制面板程式,如字体、键盘、鼠标配置等;如图1所示。我们也能够根据实际的需要创建自己的控制面板程式,以便让用户来查看或修改特定软件和硬件的参数配置。

控制面板的功能和操作方式
控制面板程式的主要功能是显示一个对话框让用户完成特定的任务。但是,和其他应用程式不同的是,控制面板程式并不是个单独的应用程式,他不提供标准菜单或其他方法让用户直接去操作这些对话框,而是在其他应用程式(如控制面板)的控制下操作和显示他们的对话框的。
控制面板程式通常是由一个Windows的系统工具(即控制面板)所控制,从而让用户来运行的。但是,其他应用程式只要发送控制面板程式所需要的消息并且处理他们的返回值同样能够加载并且管理这些控制面板程式,为了陈述简单,下文中我们将这类程式统称为控制面板。
大多数的控制面板程式仅显示并且维护一个对话框让用户来控制系统某一个部件的参数配置连同操作方式,但事实上控制面板程式能够提供多个对话框来控制多个系统部件(这些单个的对话框通常被称为Applet小程式)。为了区分这些对话框,控制面板程式通常为每个对话框提供一个图标。控制面板则把这些图标显示出来,供用户选择不同的对话框进行配置。

程式入口函数
前面提到,控制面板程式是特别的动态连接库(DLL),在每一个控制面板程式中必须提供一个标准的函数入口 CPlApplet ,控制面板程式通过这个函数来接收控制面板发送的消息,从而执行相应的功能,如初始化程式、显示并且管理对话框连同关闭程式等。
当控制面板首次加载控制面板程式时取得CPlApplet函数的地址,通过该地址去调用控制面板程式的函数连同给他发送消息。
控制面板能够向控制面板程式发送的消息名称及其意义如下表所示:
消息名称
含义
CPL_DBLCLK
该消息通知CPlApplet函数用户双击了某对话框相关联的图标。CPlApplet应该显示相应的对话框并且完成用户指定的任务。
CPL_EXIT
该消息在最后一条CPL_STOP消息之后,并且控制面板调用FreeLibrary 函数释放包含控制面板程式的动态连接库DLL 之前调用。CPlApplet应该释放所用资源准备关闭。
CPL_GETCOUNT
该消息在发送了CPL_INIT消息之后发送,CPlApplet应该返回一个整数指明他支持多少个对话框。
CPL_INIT
该消息在控制面板动态连接库DLL程式首次加载时调用, CPlApplet在此能够执行一些初始化过程,包括内存的分配。
CPL_INQUIRE
该消息在CPL_GETCOUNT消息之后发送,让CPlApplet提供特定对话框的信息。CPlApplet的lParam2参数指向一个CPLINFO结构。
CPL_NEWINQUIRE
该消息在CPL_GETCOUNT消息之后发送,让CPlApplet提供指定对话框的信息。参数lParam2是指向NEWCPLINFO结构的指针,在Windows 95 and Windows NT version 4.0,为了提高性能,控制面板程式应该处理CPL_INQUIRE消息,而不是CPL_NEWINQUIRE消息。
CPL_STOP
在控制面板关闭前向每一个对话框发送该消息。CPlApplet应该释放和给定对话框相关联的内存资源。

消息处理
回调函数CPlApplet处理任何由控制面板发送给控制面板程式的上述消息,这些消息是按照特定的顺序来发送并且处理的。
当控制面板首次加载控制面板程式的动态连接库时,CPlApplet收到CPL_INIT消息。CPlAppet在处理该消息的程式中应该执行一些初始化的工作,如分配内存等,并且返回非0值;假如CPlApplet初始化失败,则应该返回0,控制面板将停止向CPlApplet发送消息并且释放已加载的动态连接库DLL。
当CPL_INIT消息处理成功之后,CPlApplet函数将收到CPL_GETCOUNT消息,CPlApplet函数必须返回该控制面板程式所支持的对话框的数目。
对应控制面板所支持的每一个对话框,CPlApplet函数收到由控制面板发送的一条CPL_INQUIRE消息和一条CPL_NEWINQUIRE消息。函数需要用控制面板程式的信息填充CPLINFO或NEWCPLINFO结构体,如名称、图标连同描述字符串等。多数控制面板程式仅需处理CPL_INQUIRE消息而将CPL_NEWINQUIRE消息忽略。CPL_INQUIRE通过一个控制面板能够缓存的结构存放信息从而提高性能。CPL_NEWINQUIRE仅当您需要根据电脑的状态来改变控制面板程式的图标和显示字符串时有用。
当用户在控制面板中双击某个对话框所对应的图标时, CPlApplet函数将收到一条CPL_DBLCLK消息,CPlApplet函数能够收到该消息多次。该消息包含了对话框的标志和一个lData数据,CPlApplet函数应该显示相应的对话框并且处理用户的输入。
当控制面板关闭时,对应控制面板程式支持的每一个对话框, CPlApplet函数将收到一条CPL_STOP消息。该消息包含了对话框的标志连同lData数据,CPlApplet函数应该释放此对话框所占用的资源。
在最后一条CPL_STOP消息之后, CPlApplet将收到一条CPL_EXIT消息。此时应该释放此控制面板程式所占用的任何资源。在该消息返回之后,控制面板将调用FreeLibrary 来释放控制面板程式动态连接库。

控制面板程式的安装
在编译连接输出文档名选项中将输出文档扩展名改为.CPL,编译连接成功后将其拷贝到windows的SYSTEM目录即可。

示例程式:
该示例程式将显示一个对话框,并且根据用户的输入改变系统注册表中相应的数据.按上小节所述的安装方法安装控制面板示例程式后,再次启动控制面板,在控制面板中将出现示例程式的图标,双击该图标后将弹出一个对话框。如图2所示。
该程式使用Visual C 研发,从File菜单选择New,再选择MFC AppWizard,工程名称为CPL,如图3所示。单击OK之后再选择MFC Extention DLL,如图4所示。这样,Visual C 将为我们创建一个包含资源文档,DEF文档的动态连接库工程。
在Visual C AppWizard为我们创建的工程中,加入一个图标资源和字符串资源,ID分别为ID_ICON1和ID_STRING1,然后再加入一个图2所示对话框,其中有一个CheckBox,ID为ID_CHECK1。并且将工程的输出文档名改为CDAUTO.CPL,方法是选择Project菜单的Settings...项,如图5所示。以下是程式的清单。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 用VC 实现http代理

下一篇: C 的类和类的定义