專案架構概覽
- 專案類型:單文檔 (SDI)
- 視圖類別:
- 左側樹狀:
CRegLeftView (基類 CTreeView)
- 右側列表:
CRegExplorerView (基類 CListView)
- 分割視窗:
CMainFrame 內嵌 CSplitterWnd m_wndSplitter,1 行 2 欄。
- 文檔類:
CRegExplorerDoc 持有 CRegExplorerView* m_RegExplorerView 協調雙視圖通訊。
關鍵實作步驟
1. 修改 CRegExplorerApp::InitInstance
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CRegExplorerDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CRegLeftView)); // 原為 CRegExplorerView
2. 主框架建立分割視窗
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); // 左欄最小 200、理想 100
return TRUE;
}
3. 左側樹狀視圖與文檔通訊
class CRegExplorerDoc; // 前向宣告
class CRegLeftView : public CTreeView {
public:
CRegExplorerDoc* GetDocument() {
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CRegExplorerDoc)));
return (CRegExplorerDoc*)m_pDocument;
}
// ... 樹狀節點操作、註冊表鍵值枚舉、右鍵選單等
};
核心功能模組規劃
- 註冊表資料顯示與操作:樹狀展開
HKEY_* 根鍵,遞迴枚舉子鍵;列表顯示值名稱/類型/資料。支援新增/刪除/修改鍵值。
- 匯入/匯出 .reg 檔:
RegSaveKey/RegRestoreKey 或解析 .reg 文字格式。
- 搜尋與取代:遞迴掃描鍵值名稱/資料,支援正則表達式。
- 權限編輯:
RegGetKeySecurity/RegSetKeySecurity 操作 ACL。
- 收藏/書籤:常用路徑快速跳轉。
註冊表 API 快速參考
| 操作 | API |
| 開啟鍵 | RegOpenKeyEx |
| 建立鍵 | RegCreateKeyEx |
| 枚舉子鍵 | RegEnumKeyEx |
| 枚舉值 | RegEnumValue |
| 查詢值 | RegQueryValueEx |
| 設定值 | RegSetValueEx |
| 刪除鍵/值 | RegDeleteKey/RegDeleteValue |
| 關閉鍵 | RegCloseKey |
開發建議
- 樹狀節點
LPARAM 儲存完整鍵路徑或 HKEY,展開時動態載入(虛擬樹),避免一次載入大量鍵值導致卡頓。
- 列表使用
LVS_OWNERDATA (虛擬清單) 配合大量值資料。
- 所有註冊表操作包裝為
CRegKey (ATL) 或自訂 RAII 類別,確保句柄釋放。
- 寫入操作需管理員權限,Manifest 設定
requireAdministrator。
- 危險操作(刪除系統鍵)加入二次確認與備份機制。