227上位机VC MFC编写控制面板程序
227上位机VC MFC编写控制面板程序 功能展示 打开控制面板,我们可以看到有许多程序图标,可以打开这些程序设置属性,比如设置电脑声音,设置电脑输入法,设置某些程序的属性,我们当前例程也编写一个控制面板程序,让用户可以通过控制面板打开我们的程序,实现我们想要的功能,效果如图; 要点提示 1.控制面板程序是一个后缀为cpl(CONTROL PANEL)的动态库程序,我们只要创建一个动态库存程序,后缀改DLL为cpl就是一个控件面板程序;但它和一般DLL还是有所差别的,因为它带有一个特殊接 口,此接口由系统的控制面板调用,这个接口就是CPlApplet函数,下面是它的原型:LRESULT CPlApplet(HWND hwnd, UINT msg, LPARAMlp1, LPARAM lp2);我们就是在此函数中实现特定功能; 函数体内会出现一些宏CPL_INIT为程序初始化调用; CPL_GETCOUNT为程序窗口的个数;CPL_EXIT程序退出时调用;CPL_DBLCLK为用户点击或双击调用等等; 2.在建立的动态库功能完成后,在CPlApplet()函数编写好后还得在def文件中申明CPlApplet()函数为输出类型; 注意控制面板程序后缀为cpl,所以生成的动态库如gkbc8.dll应改为gkbc8.cpl; 生成程序名不以数字结尾,如gkbc8.cpl,控制面板不识别,改为gkbc.cpl可以正常运行 3.一般的控制面板程序都是有界面的程序,我们当前例程实现了有界面的控制面板程序的编写,具体看后面的实现过程; 实现功能 1.新建基于MFC扩展动态库(使用共享的MFC DLL)的应用程序 2.为了使我们建立的动态库具有窗口界面,我们将要对建立的动态库工程进行改动; 3.删除入口函数DllMain()所在的文件,将例程中CPanel.cpp, Cpanel.h复制到自己工程根目录,并加载到项目工程中,在def文件中添加CPlAppletPRIVATE,申明CPlApplet()函数为动态库输出类型,供控制面板调用,不然系统控制面板程序不识别我们的程序; 4.在stdafx.h头文件包含必要的头文件#include <cpl.h>//控制面板回调函数用 头文件 #include “CPanel.h” //自定义头文件 #include "resource.h"// 资源ID头文件 5.新建一对话框资源,ID为IDD_DIALOG1,关联对话框类,例程的为CGkbc8Dlg;稍微修改此类:头文件添加#include “resource.h”用于识别工程的资源。再添加DECLARE_DYNCREATE(CGkbc8Dlg);源文件也添加IMPLEMENT_DYNCREATE(CGkbc8Dlg, CDialog);使我们的对话框类可以动态的创建 ;删除源文件中工程为我们建立的没用的代码:#include “\ add additional includeshere“;添加对话框虚函数PostNcDestroy()且在函数中添加代码delete this;用以避免内存溢出 6.新建一普通类型新类,例程类名为CGbc8App,稍微修改此类:使类public继承于CControlPanelApp,class CGbc8App :public CControlPanelApp ;头文件添加DECLARE_DYNAMIC(CGbc8App),源文件添加CGbc8App theApp; IMPLEMENT_DYNAMIC(CGbc8App, CControlPanelApp),使类可以动态的创建实例; 重载CControlPanelApp的虚函数OnInit(),在此函数中创建对话框窗口,记得包含对话框头文件#include "Gkbc8Dlg.h" BOOLCGbc8App::OnInit() { AddApplet(newCCPApplet(IDD_DIALOG1, RUNTIME_CLASS(CGkbc8Dlg), TRUE)); returnCControlPanelApp::OnInit(); } 7.准备程序的图标ID,程序名ID,这些ID都在函数OnInit中以相同ID名传入,并在CCPApplet类的函数OnNewInquire()中被设置;载入一图标ID修改为IDD_DIALOG1;新建一string table,在其添加一字符串ID为IDD_DIALOG1,内容变为程序的名称及描述:工控编程吧(gkbc8.com)\n控制面板程序开发例程\n点击打开程序\n 8.修改生成的动态库后缀DLL为CPL,确保程序名为不数字结尾,将程序复制到系统目录system32中便可在控制面板中看到我们自己设计的图标与程序名; 我们来演示下功能实现的整个过程
|