烟台市铁路建设管理局网站,电子商务网站开发开发背景,网站设计开发团队,十种网络营销的方法WinCE系统中的控制面板和Windows系统中的控制面板原理是一样的#xff0c;里面就是包含了一些应用程序。WinCE系统的控制面板由Ctlpnl.exe#xff0c;Control.exe和一些.cpl文件组成#xff0c;其中Ctlpnl.exe和Control.exe用于控制控制面板的文件夹显示和架构#xff0c;而… WinCE系统中的控制面板和Windows系统中的控制面板原理是一样的里面就是包含了一些应用程序。WinCE系统的控制面板由Ctlpnl.exeControl.exe和一些.cpl文件组成其中Ctlpnl.exe和Control.exe用于控制控制面板的文件夹显示和架构而.cpl文件和控制面板中的实际应用程序相对应。 WinCE的控制面板中的每个应用程序都由两部分组成应用程序本身和所对应的.cpl文件。实际上.cpl文件就是一个dll在该dll中会导出CPLApplet函数该函数会处理来自控制面板的消息(CPL_INIT, CPL_DBCLK, CPL_STOP等)然后根据相应的消息来调用应用程序。 先来看一下CPlApplet函数如下 LONG CPlApplet(HWND hwndCPl, UINT msg, LPARAM lParam1, LPARAM lParam2) hwndCPl控制面板窗口的句柄 msg发给控制面应用程序的消息 lParam1消息参数1 lParam2消息参数2 该函数会根据msg参数传入的消息进行相应的处理WinCE中所支持的控制面板消息如下 CPL_INIT被首次加载的时候会收到该消息也是第一个消息用于初始化控制面板应用程序比如内存分配等。 CPL_GETCOUNT第二个被收到的消息该消息用于获得该控制面板应用程序中的组件数因为.cpl文件中可能包含多个Applet程序。 CPL_NEWINQUIRE查询组件信息如果该.cpl中包含多个组件那么lParam1表示组件号lParam2是一个指向NEWCPLINFO结构的指针其中NEWCPLINFO结构用于描述组件信息。 CPL_DBCLK用户在控制面板界面中双击某个应用时会收到该消息在该消息中执行对应的应用程序。如果包含多个组件那么lParam1表示组建号lParam2为传给应用程序的数据。 CPL_STOP关闭控制面应用程序时收到该消息用于释放资源。如果包含多个组件那么lParam1表示组件号lParam2为传给应用程序的数据。 CPL_EXIT在CPL_STOP消息之后控制面板释放该应用程序时收到该消息。 在CPlApplet中收到CPL_NEWINQUIRE消息时会初始化NEWCPLINFO结构来描述组件信息该结构定义如下 typedef struct tagNEWCPLINFO { DWORD dwSize; DWORD dwFlags; DWORD dwHelpContext; LONG lData; HICON hIcon; TCHAR szName[32]; TCHAR szInfo[64]; TCHAR szHelpFile[128]; } NEWCPLINFO; dwSize该结构的信息 dwFlags忽略 dwHelpContext忽略 lData传给组建程序的数据 hIcon显示在控制面板中的图标的句柄 szName显示在控制面板中的组件的名字 szInfo显示在控制面板中的描述信息 szHelpFile忽略 前面介绍了控制面板的基础知识下面就开始添加应用程序到WinCE控制面板中步骤如下 1. 创建一个WinCE的工程然后添加一个应用程序 首先要有一个WinCE的工程然后点击File-New-Subproject然后选择WCE Application然后可以选择Hello World应用程序。 2. 为应用程序创建CPL工程 同样点击File-New-Subproject然后选择WCE Dynamic-Link Library工程名为HelloCPL然后点击Next在Auto-generated subproject files页面中选择A Dll that exports some symbols然后点击Finish完成。 3. 添加CPlApplet函数 打开HelloCPL工程并打开HelloCPL.cpp文件添加如下头文件 #include tchar.h #include “cpl.h” 然后添加如下代码 #define lengthof(exp) ((sizeof((exp)))/sizeof((*(exp)))) HMODULE g_hModule NULL; // Handle to the DLL. BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: { g_hModule (HMODULE) hModule; } case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } // --------------------------- // The entry point to the Control Panel application. // --------------------------- extern C HelloCPL_API LONG CALLBACK CPlApplet(HWND hwndCPL, UINT message, LPARAM lParam1, LPARAM lParam2) { switch (message) { case CPL_INIT: // Perform global initializations, especially memory // allocations, here. // Return 1 for success or 0 for failure. // Control Panel does not load if failure is returned. return 1; case CPL_GETCOUNT: // The number of actions supported by this Control // Panel application. return 1; case CPL_NEWINQUIRE: // This message is sent once for each dialog box, as // determined by the value returned from CPL_GETCOUNT. // lParam1 is the 0-based index of the dialog box. // lParam2 is a pointer to the NEWCPLINFO structure. { ASSERT(0 lParam1); ASSERT(lParam2); NEWCPLINFO* lpNewCplInfo (NEWCPLINFO *) lParam2; if (lpNewCplInfo) { lpNewCplInfo-dwSize sizeof(NEWCPLINFO); lpNewCplInfo-dwFlags 0; lpNewCplInfo-dwHelpContext 0; lpNewCplInfo-lData IDI_HELLO; // The large icon for this application. Do not free this // HICON; it is freed by the Control Panel infrastructure. lpNewCplInfo-hIcon LoadIcon(g_hModule, MAKEINTRESOURCE(IDI_HELLO)); LoadString(g_hModule, IDS_APP_TITLE, lpNewCplInfo-szName, lengthof(lpNewCplInfo-szName)); LoadString(g_hModule, IDC_Hello, lpNewCplInfo-szInfo, lengthof(lpNewCplInfo-szInfo)); _tcscpy(lpNewCplInfo-szHelpFile, _T()); return 0; } return 1; // Nonzero value means CPlApplet failed. } case CPL_DBLCLK: { // The user has double-clicked the icon for the // dialog box in lParam1 (zero-based). PROCESS_INFORMATION pi {0}; if (CreateProcess(_T(\\Windows\\Hello.exe), NULL, NULL, NULL, FALSE, 0, NULL, NULL, NULL, pi)) { CloseHandle(pi.hThread); CloseHandle(pi.hProcess); return 0; } return 1; // CPlApplet failed. } case CPL_STOP: // Called once for each dialog box. Used for cleanup. case CPL_EXIT: // Called only once for the application. Used for cleanup. default: return 0; } return 1; // CPlApplet failed. } // CPlApplet 具体不做解释了相信自己看一下都能看明白。在上面的代码中处理消息CPL_NEWINQUIRE的时候加载了IDI_HELLOIDS_APP_TITLE和IDC_Hello三个资源分别是一个图标和两个字符串。为工程添加rc资源文件和resource.h头文件导入图标资源和字符串资源。资源的导入和定义比较简单所以不介绍具体步骤了。 4. 修改HelloCPL工程配置 打开HelloCPL.bib文件添加如下内容 MODULES HelloCPL.cpl $(_FLATRELEASEDIR)\HelloCPL.cpl NK 右击HelloCPL工程选择Properities选择General页面在Custom Variables项中添加变量变量名字为CPL值为1。 再次右击HelloCPL工程选择Properities选择C/C页面确认Additional Macro Definitions的值为$(CDEFINES) -DHelloCPL_EXPORTS。设置DLL Entry Point项为DllMain。在Include Directories项中添加路径$(_PROJECTROOT)\cesysgen\oak\inc。 5. 编译Hello应用程序和HelloCPL工程 编译开始创建的Hello应用程序和HelloCPL工程在WinCE6.0中编译完成后会自动Makeimg操作。 通过上面的步骤可以把应用程序添加到WinCE系统的控制面板中最后编译成功以后就可以下载运行了在此我添加了一个Hello的应用程序名字叫Hello application运行结果如图