首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

DIY 圖片瀏覽器:整合 CJ60Lib CShellTree 與 Thalia CThumbListCtrl 快速構建 ACDSee 風格應用

     編輯:關於C語言

專案目標

打造類 ACDSee 風格圖片瀏覽器:左側目錄樹、右側縮圖列表、支援多種格式、縮圖美觀、瀏覽流暢、Win98/NT 相容。

第三方元件選型

專案框架生成 (VC6 AppWizard)

  1. File → New → MFC AppWizard (exe),專案名 SimpleBrowse。
  2. Step 1: Single Document。
  3. Step 4: Internet Explorer ReBars (工具列/位址列)。
  4. Step 5: Windows Explorer (分割視窗:左樹右列表)。
  5. 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++ 開源專案參考。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
功能區元件來源關鍵類別
左側目錄樹CJ60Lib (CodeJock/CodeJockeys)https://www.codejockeys.com/kstowell/CShellTree — 封裝 Shell 命名空間,原生資源管理器外觀
右側縮圖列表Thalia Imaging Library (THL)https://www.thalia.com.cn/CThumbListCtrl — 非同步縮圖生成、多格式支援、虛擬模式