| 功能區 | 元件 | 來源 | 關鍵類別 |
| 左側目錄樹 | CJ60Lib (CodeJock/CodeJockeys) | https://www.codejockeys.com/kstowell/ | CShellTree — 封裝 Shell 命名空間,原生資源管理器外觀 |
| 右側縮圖列表 | Thalia Imaging Library (THL) | https://www.thalia.com.cn/ | CThumbListCtrl — 非同步縮圖生成、多格式支援、虛擬模式 |
專案框架生成 (VC6 AppWizard)
File → New → MFC AppWizard (exe),專案名 SimpleBrowse。
- Step 1: Single Document。
- Step 4: Internet Explorer ReBars (工具列/位址列)。
- Step 5: Windows Explorer (分割視窗:左樹右列表)。
- Finish 生成 SDI 分割視窗架構。
左視圖整合 CShellTree
// LeftView.h
class CLeftView : public CView { // 原為 CTreeView,改為 CView 手動管理
CJShellTree m_wndTree; // CJ60Lib 類別
public:
// ...
protected:
afx_msg int OnCreate(LPCREATESTRUCT);
afx_msg void OnSize(UINT, int, int);
afx_msg void OnItemExpanding(NMHDR*, LRESULT*);
afx_msg void OnSelChanged(NMHDR*, LRESULT*);
DECLARE_MESSAGE_MAP()
};
// LeftView.cpp
int CLeftView::OnCreate(LPCREATESTRUCT lpCS) {
if (CView::OnCreate(lpCS) == -1) return -1;
CRect rect(0,0,0,0);
m_wndTree.Create(WS_CHILD|WS_VISIBLE|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_SHOWSELALWAYS,
rect, this, 100);
m_wndTree.Initialize(); // 掛載 Shell 命名空間根節點 (桌面/我的電腦)
return 0;
}
void CLeftView::OnSize(UINT nType, int cx, int cy) {
CView::OnSize(nType, cx, cy);
if (m_wndTree.GetSafeHwnd()) m_wndTree.MoveWindow(0, 0, cx, cy);
}
void CLeftView::OnSelChanged(NMHDR* pNMHDR, LRESULT* pResult) {
NM_TREEVIEW* pNM = (NM_TREEVIEW*)pNMHDR;
// 取得選中項目對應的檔案系統路徑
CString strPath = m_wndTree.GetItemPath(pNM->itemNew.hItem);
// 通知右視圖更新縮圖列表
CRightView* pRight = (CRightView*)((CMainFrame*)AfxGetMainWnd())->GetRightView();
if (pRight) pRight->SetFolderPath(strPath);
*pResult = 0;
}
右視圖整合 CThumbListCtrl
// RightView.h
class CRightView : public CView {
CThumbListCtrl m_wndThumbList; // THL 類別
public:
void SetFolderPath(LPCTSTR lpszPath); // 公開介面
protected:
afx_msg int OnCreate(LPCREATESTRUCT);
afx_msg void OnSize(UINT, int, int);
DECLARE_MESSAGE_MAP()
};
// RightView.cpp
int CRightView::OnCreate(LPCREATESTRUCT lpCS) {
if (CView::OnCreate(lpCS) == -1) return -1;
CRect rect(0,0,0,0);
// 樣式:報表視圖、單選、縮圖模式、自動排列
m_wndThumbList.Create(WS_CHILD|WS_VISIBLE|LVS_REPORT|LVS_SINGLESEL|LVS_AUTOARRANGE|LVS_SHAREIMAGELISTS,
rect, this, 101);
// THL 特有初始化
m_wndThumbList.SetThumbnailSize(96, 96); // 縮圖尺寸
m_wndThumbList.SetFileFilter(_T("*.jpg;*.jpeg;*.bmp;*.gif;*.png;*.tif;*.tiff")); // 支援格式
return 0;
}
void CRightView::SetFolderPath(LPCTSTR lpszPath) {
m_wndThumbList.SetFolderPath(lpszPath); // 觸發非同步掃描目錄、生成縮圖
}
void CRightView::OnSize(UINT nType, int cx, int cy) {
CView::OnSize(nType, cx, cy);
if (m_wndThumbList.GetSafeHwnd()) m_wndThumbList.MoveWindow(0, 0, cx, cy);
}
主框架分割器調整
AppWizard 生成的 CMainFrame 已包含 CSplitterWnd,左右視圖對應 CLeftView/CRightView。無需額外修改。
工具列/選單功能擴充
- 檢視模式切換:
m_wndThumbList.SetViewMode(THUMB_VIEW / LIST_VIEW / DETAIL_VIEW)。
- 縮圖大小調整: 滑桿/選單呼叫
SetThumbnailSize。
- 全螢幕預覽: 雙擊縮圖項目 → 彈出對話框
CImagePreviewDlg 使用 IPicture/GDI+ 顯示原圖。
- 檔案操作: 刪除/重命名/複製 → Shell API
SHFileOperation。
部署與相容性
- CJ60Lib.dll、THL.dll 需隨應用程式部署 (同目錄或系統目錄)。
- Win98 需安裝 IE 4.0+ (Shell 擴充支援) 和 GDI+ 可轉散發套件 (THL 可能依賴)。
- NT 4.0 需 SP6a + IE 5.0+。
現代化替代方案 (參考)
- 目錄樹:
CTreeCtrl + SHBrowseForFolder/IShellFolder 手寫、或 Qt QFileSystemModel、MFC CMFCShellTreeCtrl (VS2008+)。
- 縮圖列表:
CMFCShellListCtrl (VS2008+)、Windows Shell IShellItemImageFactory 取得系統縮圖、GDI+ Image::GetThumbnailImage 手寫非同步佇列、WIC 高效能解碼。
- 完整方案:
ShellBrowser 元件套件 (商業)、Explorer++ 開源專案參考。
- 上一篇文章: MDI 客戶區動態背景旗幟:CMdiMainClient 定時器輪播位圖實作
- 下一篇文章: 圖標資源提取與保存完整指南:從原理到 MFC 實戰
Copyright ©
程式碼之家 All Rights Reserved