示範 List View 控制項的虛擬清單 (LVS_OWNERDATA) 與自繪功能,結合 Shell 介面 (IShellFolder, IExtractImage) 實現資料夾縮圖顯示,類似 Windows 檔案總管。
PreCreateWindow 設定 LVS_ICON | LVS_OWNERDATA,OnInitialUpdate 設定 SetCallbackMask(LVIS_OVERLAYMASK)。LVN_ODCACHEHINT 預先快取可視範圍項目資訊;處理 LVN_GETDISPINFO 依需求提供文字、圖示、狀態。SHGetDesktopFolder、BindToObject 取得資料夾 IShellFolder,GetUIObjectOf 取得 IExtractImage 擷取縮圖。RedrawItems 更新介面。BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs) {
cs.style &= ~LVS_TYPEMASK;
cs.style |= LVS_ICON | LVS_OWNERDATA;
return CListView::PreCreateWindow(cs);
}
void CMyView::OnInitialUpdate() {
CListView::OnInitialUpdate();
GetListCtrl().SetCallbackMask(LVIS_OVERLAYMASK);
}
void CMyView::OnGetdispinfo(NMHDR* pNMHDR, LRESULT* pResult) {
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
if (pDispInfo->item.iItem == -1) return;
// 從快取或即時取得項目資訊,填入 pDispInfo->item
*pResult = 0;
}
完整專案碼請下載原文附件。