编写控制面板程序的一个例子

本文配套源码

最近在编写一个Windows 98 和 Windows 2000 系统中使的MPEG播放器,我想创建一个控制面板程序,用户可以通过这个程序改变播放器的 基本配置。大家知道,控制面板程序一般都是个DLL动态库,然后将名字改为*.cpl。查找了许多资料后,发现所看到的一些例子都是用C写的。能不能在MFC中用C++来编写一个呢?答案是肯定的。本文将通过一个实际的VC++例子来示范如何编写MFC控制面板程序。

首先要清楚虽然控制面板程序是一个DLL,但它和一般DLL还是有所差别的,因为它带有一个特殊的输出接口,这个接口就是CPlApplet函数,下面是它的原型:

LRESULT CPlApplet(HWND hwnd,
         UINT msg,
         LPARAM lp1,
         LPARAM lp2);  

为了使本文的例子代码尽可能的具有可重用性,我用C++对控制面板的接口函数进行了封装。 做了一个迷你型的控制面板应用程序开发框架,利用它开发控制面板扩展程序易如反掌。 控制面板程序除了是个特别的DLL外,还有一个特点是其扩展名必须为 *.cpl,而不是*.dll。当Windows的控制面板管理程序 (CONTROL.EXE)启动后,它会在系统目录(如:windows\system或者winnt\system32)中寻找名为XXX.cpl的文件,然后加载每一个DLL并以不同的消息 参数调用CPlApplet函数。例如,当控制面板第一次启动时,它用消息msg=CPL_INIT调用 CPlApplet函数,当用户双击控制面板中的应用程序图标时,它用消息msg=CPL_DBLCLK调用CPlApplet函数,然后控制面板应用程序显示相应的对话框,每个控制面板DLL都能支持一个以上的图标或应用。通过对消息CPL_GETCOUNT的响应,可以让控制面板知道DLL中有多少个应用,通过发送CPL_INQUIRE 或 CPL_NEWINQUIRE消息,控制面板可以请求 与每一个应用有关的信息。 图一是用一个跟踪程序(TraceWin)显示的TRACE Dump,从中可以看出控制面板对消息的处理情况。

图一 使用TraceWin 显示的 TRACE Dump

由于大多数控制面板和DLL之间的交互都有固定的套路,所以可以被封装在一个框架里。本文提供了两个类,CControlPanelApp 和 CCPApplet,实现了上述的封装。为了说明这两个类的使用方法, 本文还编写了示范的控制面板程序应用DLL:MyCtrlPanel.dll,它实现了两个控制面板应用,图二是本文例子程序运行后在控制面板里创建的两个图标 ,这两个图标一个是对话框形式(如图三)、一个是属性页 形式(如图四)。

图二 例子程序图标

图三

图四

时间: 2024-07-31 10:21:39

编写控制面板程序的一个例子的相关文章

mfc-vc++怎么在系统 控制面板程序程序和功能 里面添加自己的程序

问题描述 vc++怎么在系统 控制面板程序程序和功能 里面添加自己的程序 vc++怎么在系统 控制面板程序程序和功能 里面添加自己的程序怎么让360软件管家 以及其他的软件管家检测到自己的程序 vc 怎么实现 解决方案 只要把你的程序信息写在注册表的localmachinesoftwaremicrosoftwindowscurrentversionuninstall下,新建一个键,添加你的安装程序路径(你可以参考别的程序的做法). 然后就有了. 解决方案二: 编写控制面板程序的一个例子 如何编写

编程c语言-C语言大型程序一个例子为什么不能运行

问题描述 C语言大型程序一个例子为什么不能运行 我编写了两张图里四个文件,一个.h和三个.c,然后按照给出的那个命令运行,却出现一堆错误和warning,怎么回事?一般大点的程序按这种编写方法怎么链接和用什么命令运行? 解决方案 warning不影响运行,没有error就行 解决方案二: 有时候编译器的版本不一样也会出错的,也有课能本上给出的代码是伪代码 解决方案三: C语言实现的一个程序只能运行一次,不能重复运行 解决方案四: 这是用gcc运行是的错误 解决方案五: 要用gcc -o命令先编译

Android For JNI(一)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序,使用C启动JAVA程序

Android For JNI(一)--JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序 当你的Android之旅一步步的深入的时候,你其实会发现,很多东西都必须去和framework或者底层打交道,还有就是混合编程之类的,以及新语言,新特性,各种牛人研究的黑科技,应接不暇,技术更新迭代太快了,我们要赶紧加快步伐了,今天就开始来入坑了--JNI,这个坑是必须要进的,啥也不说了,老司机,带我! 一.什么是JNI? Java Native Interface(java本地接口)

有没有会编写c程序的大神,帮我看看两个单独的程序怎么合成一个程序,谢谢

问题描述 有没有会编写c程序的大神,帮我看看两个单独的程序怎么合成一个程序,谢谢 #include #include struct e { char a[10]; char b[10]; }z; int main() { int t=0; char s[10],d[10]; FILE *p; void as(); if ((p=fopen("m.txt","r+"))==NULL) { p=fopen("m.txt","w+"

c语言-编写一程序,将带头结点的单链表拆成一个奇数链表和一个偶数链表

问题描述 编写一程序,将带头结点的单链表拆成一个奇数链表和一个偶数链表 要求用C语言来做!! 解决方案 http://zhidao.baidu.com/link?url=5XqMAQVb1yS0vaNF3QXC9fQPICC-JgqN0lisYvRQHwzYF8jb3ek3ouh_2TG3NKa4eanjSv4illaaV1znE-nkuq 解决方案二: BaiDu:将带头结点的单链表拆成一个奇数链表和一个偶数链表 你会得到很多你想要的. 解决方案三: 这个简单,可以看看面试宝典

求助.我拿到一个用VB.net 语言 Vs2005 和Access工具 编写的程序 可我不会运行 急求高手指点

问题描述 求助.我拿到一个用VB.net语言Vs2005和Access工具编写的程序可我不会运行急求高手指点请对这方面的有研究的高手联系QQ873498013我把程序发给你,只要告诉我如何配置运行的即可.Q币相赠大伙帮帮忙啊真得很急! 解决方案 解决方案二:安装.netFrameWork2.0解决方案三:安装2005就可以调试了解决方案四:我已经加你了

如何生成JSON还有如何从JSON中取出值呢?大家给一个例子程序最好!

问题描述 如何生成JSON还有如何从JSON中取出值呢?大家给一个例子程序最好! 解决方案 解决方案二:网上搜索有的是例子解决方案三: 解决方案四:使用newtonsoft.dll可将实体对象转换为json解决方案五:最简单的方法:stringjson='{"UserID":95,"Username":"fxdw001_001"},{"UserID":96,"Username":"fxdw001_

Visual C#中编写多线程程序之起步

visual|程序|多线程 .NET将关于多线程的功能定义在System.Threading名字空间中.因此,要使用多线程,必须先声明引用此名字空间(using System.Threading;). 即使你没有编写多线程应用程序的经验,也可能听说过"启动线程""杀死线程"这些词,其实除了这两个外,涉及多线程方面的还有诸如"暂停线程""优先级""挂起线程""恢复线程"等等.下面将一个一个

Visual C#中用WMI编写网络应用程序

visual|程序|网络 WMI是Windows Management Instrumentation的简称,即:视窗管理规范.在Windows 2000或以后的版本中均安装得有,NT4.0则需要安装WMI的核心组件.通过WMI可以获取远程计算机的各种数据信息,控制远程计算机的各种行为,而这就像操作本地机一样方便.简单. 一.WMI简介 WMI从根本上说应该为一种服务,并且对于本地不同的用户,WMI所有的权限也不一样.计算机超级用户可以为计算机中的每一个用户,设定不同的WMI权限.在默认状态下,