專案架構設計
- AppWizard 建立 SDI 專案
RegExplorer,Step 6 視圖基類選 CListView。
- 手工新增左側樹狀視圖類
CRegLeftView (基類 CTreeView),實現雙欄分割介面 (類似 Regedit)。
CMainFrame 使用 CSplitterWnd 分割:左欄樹狀 (固定 200px),右欄列表。
核心框架代碼
文件模板調整
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CRegExplorerDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CRegLeftView)); // 原為 CRegExplorerView
分割視窗建立
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) {
if (!m_wndSplitter.CreateStatic(this, 1, 2)) return FALSE;
if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CRegLeftView), CSize(100,100), pContext) ||
!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CRegExplorerView), CSize(100,100), pContext)) {
m_wndSplitter.DestroyWindow(); return FALSE;
}
m_wndSplitter.SetColumnInfo(0, 200, 100); // 左欄最小 100,理想 200
return TRUE;
}
文件類作為通訊中介
class CRegExplorerDoc : public CDocument {
// ...
CRegExplorerView* m_pRegExplorerView; // 右側列表視圖指標
// 左側樹狀視圖可透過 GetDocument() 取得文件指標,再存取 m_pRegExplorerView
};
左側樹狀視圖 CRegLeftView 關鍵實作
class CRegExplorerDoc; // 前向宣告
class CRegLeftView : public CTreeView {
// ...
CRegExplorerDoc* GetDocument() {
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CRegExplorerDoc)));
return (CRegExplorerDoc*)m_pDocument;
}
// 核心功能:
// 1. OnInitialUpdate: 遞迴枚舉 HKEY_LOCAL_MACHINE 等根鍵,建立樹節點
// 2. 節點展開時動態載入子鍵 (TVN_ITEMEXPANDING)
// 3. 選擇變更 (TVN_SELCHANGED) 通知右側列表刷新值列表
// 4. 右鍵選單:新建/刪除/重命名鍵值、匯入/匯出 .reg 檔
};
註冊表核心 API 封裝建議
| 操作 | API | 備註 |
| 開啟鍵 | RegOpenKeyEx | 需指定存取權限 (KEY_READ/KEY_WRITE) |
| 建立鍵 | RegCreateKeyEx | 不存在則建立 |
| 刪除鍵/值 | RegDeleteKey / RegDeleteValue | Win2000+ 支援遞刪 RegDeleteTree (需 shlwapi.h) |
| 查詢值 | RegQueryValueEx | 先查大小再配置緩衝區讀取 |
| 設定值 | RegSetValueEx | 支援 REG_SZ, REG_DWORD, REG_BINARY 等 |
| 枚舉子鍵/值 | RegEnumKeyEx / RegEnumValue | 迴圈索引從 0 開始直到 ERROR_NO_MORE_ITEMS |
進階功能規劃 (文中提及後續闡述)
- 註冊表匯入/匯出:解析 .reg 文本格式,遞迴建立/刪除鍵值;匯出時遞迴寫入標準格式。
- 搜尋與替換:多執行緒遞迴掃描,支援鍵名、值名、資料內容匹配,結果在獨立對話框列表呈現雙擊跳轉。
- 權限編輯:整合
RegGetKeySecurity/RegSetKeySecurity,提供 ACL 編輯對話框。
- 快照比對:兩次掃描差異報告,輔助軟體安裝追蹤。
開發注意事項
- 操作
HKEY_LOCAL_MACHINE 需管理員權限,Manifest 加入 requireAdministrator。
- 大量枚舉時於背景執行緒執行,避免 UI 凍結,完成後
PostMessage 通知主執行緒更新樹狀控件。
- 錯誤處理:所有 API 回傳值檢查,
FormatMessage 取得系統錯誤描述顯示給用戶。
- 上一篇文章: VC++ 啟動畫面 四種實作方案完整指南:從元件庫到對話框架構
- 下一篇文章: CListCtrl 欄位點擊排序完整實作:回調函數與訊息處理範例
Copyright ©
程式碼之家 All Rights Reserved