| 消息 | 用途 | 處理者 |
| CPL_INIT | 初始化,註冊應用項 | CControlPanelApp::OnInit |
| CPL_GETCOUNT | 返回應用項數量 | 框架自動處理 |
| CPL_INQUIRE / CPL_NEWINQUIRE | 查詢圖標、名稱、描述 | CCPApplet::OnInquire / OnNewInquire |
| CPL_DBLCLK | 用戶雙擊圖標啟動 | CCPApplet::OnLaunch |
| CPL_EXIT | 釋放資源 | CControlPanelApp::OnExit |
封裝框架兩大類
CControlPanelApp
- 繼承
CWinApp,管理應用列表 m_lsApplets
- 虛函數
OnInit() 中調用 AddApplet(new CCPApplet(...))
CCPApplet
- 構造參數:資源 ID + 運行時類 (
RUNTIME_CLASS)
- 自動從字串表讀取名稱/描述(格式:
"名稱\n描述\n")
OnLaunch 根據類型創建 CDialog 或 CPropertySheet 並 DoModal
實例:MyCtrlPanel 實現雙應用
BOOL CMyControlPanelApp::OnInit() {
AddApplet(new CCPApplet(IDR_MYAPPLET1, RUNTIME_CLASS(CMyDialog)));
AddApplet(new CCPApplet(IDR_MYAPPLET2, RUNTIME_CLASS(CMyPropSheet)));
return CControlPanelApp::OnInit();
}
資源定義:
STRINGTABLE
BEGIN
IDR_MYAPPLET1 "對話框範例\n演示簡單對話框式控制面板應用\n"
IDR_MYAPPLET2 "屬性頁範例\n演示多頁籤屬性頁式控制面板應用\n"
END
關鍵實現細節
- 對話框/屬性頁類必須
DECLARE_DYNCREATE
- 重寫
OnPostNcDestroy 加入 delete this(堆上創建需手動釋放)
m_bDynamic = TRUE 可強制使用 CPL_NEWINQUIRE 避開緩存,調試期建議開啟
部署與調試
- 編譯生成
MyCtrlPanel.dll → 重命名 MyCtrlPanel.cpl
- 複製至系統目錄 (
C:\Windows\System 或 C:\Winnt\System32)
- 或在
CONTROL.INI [MMCPL] 段添加路徑映射
- 調試:
rundll32 shell32.dll,Control_RunDLL MyCtrlPanel.cpl 或指定索引 @n
卸載提示
重啟機器後刪除系統目錄下的 .cpl 文件(謹慎操作,避免誤刪)。
- 上一篇文章: VC++ 6.0 使用 MSComm 控件實現串口通信
- 下一篇文章: VC++ 實作全方位歷史記錄清除工具:從 IE 快取到系統登錄的完整解決方案
Copyright ©
程式碼之家 All Rights Reserved