




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
如何编程结束应用程序? 这是个很简单又是编程中经常要遇到的问题.向窗口发送 WM_CLOSE消息,调用 CWnd:OnClose成员函数.允许对用户提示是否保存修改过的数据. Example: AfxGetMainWindow()-SendMessage(WM_CLOSE)还可以创建一个自定义的函数 Terminate Window void Terminate Window(LPCSTR pCaption) CWnd *pWnd=Cwnd:FindWindow(NULL,pCaption)if (pWnd)pWnd -SendMessage(WM_CLOSE) 说明: FindWindow函数不是提倡的做法,因为它无法处理标题栏自动改变,比如我们要检测 Notepad是不是已运行而事先不知道Notepad的标题栏,这时FindWindow就无能为力了,可以通过枚举 windows任务列表的办法来实现。在机械出版社Windows 95 API开发人员指南一书有比较详细的介绍,这里就不再多说乐。 如何编写控制面板程序控制面板程序是用户用于配置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所示。以下是程序的清单。程序清单:/ CPL.cpp : Defines the initialization routines for the DLL./#include stdafx.h#include #include #include #include resource.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endifstatic AFX_EXTENSION_MODULE CPLDLL = NULL, NULL ;HINSTANCE hinst = NULL;BOOL FAR PASCAL CPLDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);/控制面板接口函数CPlAppletextern C int APIENTRY CPlApplet(HWND hwndCPL, UINT uMsg, LPARAM lParam1, LPARAM lParam2);extern C int APIENTRYDllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)/ Remove this if you use lpReservedUNREFERENCED_PARAMETER(lpReserved);if (dwReason = DLL_PROCESS_ATTACH)TRACE0(CPL.DLL Initializing!n);/ Extension DLL one-time initializationif (!AfxInitExtensionModule(CPLDLL, hInstance)return 0;/ Insert this DLL into the resource chain/ NOTE: If this Extension DLL is being implicitly linked to by/ an MFC Regular DLL (such as an ActiveX Control)/ instead of an MFC application, then you will want to/ remove this line from DllMain and put it in a separate/ function exported from this Extension DLL. The Regular DLL/ that uses this Extension DLL should then explicitly call that/ function to initialize this Extension DLL. Otherwise,/ the CDynLinkLibrary object will not be attached to the/ Regular DLLs resource chain, and serious problems will/ result.new CDynLinkLibrary(CPLDLL);else if (dwReason = DLL_PROCESS_DETACH)TRACE0(CPL.DLL Terminating!n);/ Terminate the library before destructors are calledAfxTermExtensionModule(CPLDLL);hinst = hInstance;return 1; / okint APIENTRY CPlApplet(HWND hwndCPL, UINT uMsg, LPARAM lParam1, LPARAM lParam2) int i; LPCPLINFO lpCPlInfo; i = (int) lParam1; switch (uMsg) case CPL_INIT: / first message, sent once return TRUE; case CPL_GETCOUNT: / second message, sent once return 1; break; case CPL_INQUIRE: / third message, sent once per application lpCPlInfo = (LPCPLINFO) lParam2; lpCPlInfo-lData = 0; lpCPlInfo-idIcon =IDI_ICON1;lpCPlInfo-idName = IDS_STRING1;lpCPlInfo-idInfo = IDS_STRING1;break; case CPL_DBLCLK: / application icon double-clicked FARPROC lpProcDlg;lpProcDlg = (FARPROC)MakeProcInstance(CPLDlg,hinst);DialogBox(hinst,MAKEINTRESOURCE(IDD_DIALOG1),hwndCPL,(DLGPROC)lpProcDlg);FreeProcInstance(lpProcDlg);break; case CPL_STOP: / sent once per application before CPL_EXIT break; case CPL_EXIT: / sent once before FreeLibrary is called break; default: break; return 0; BOOL FAR PASCAL CPLDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)DWORD dataType;BYTE data100;DWORD reserved;DWORD size;HKEY hKey = HKEY_CURRENT_USER;char ValueName=SoftwareMicrosoftWindowsCurrentVersionPoliciesExplorerNoDriveTypeAutoR
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年高科技企业员工持股计划股权激励合同模板
- 2025年商业空间室内外一体化设计施工合同范本剖析
- 2025年都市风情餐厅场地租赁与厨师团队培训服务合同
- 2025年度医院护工专业培训与服务质量优化合同
- 2025年绿色环保办公家具及耗材采购框架协议
- 饭店转让合同版
- 充电桩电力计量与收费方案
- 药店质量管理试题及答案
- 下肢静脉血栓的护理
- 雨水排放与调度管理方案
- 新版人教版八年级上册生物全册教案教学设计含教学反思
- 2025山西晋中昔阳县文化旅游发展有限责任公司社会招聘15人笔试备考题库及答案解析
- 2025-2026学年统编版(2024)初中历史八年级上册教学计划及进度表
- 成人2型糖尿病口服降糖药联合治疗专家共识解读 2
- 2025-2026学年统编版小学语文五年级上册教学计划及进度表
- 2025 - 2026学年教科版科学三年级上册教学计划
- JT-T 495-2025 公路交通安全设施产品质量检验抽样方法
- 销售话术培训方案
- 23G409先张法预应力混凝土管桩
- 铁工电〔2023〕54号国铁集团关于印发《普速铁路工务安全规则》的通知
- 《光伏发电工程工程量清单计价规范》
评论
0/150
提交评论