這個問題其實是由pocket pc的CFileDialog問題引發來的。
CFileDialog開啟後,只能選擇My Documents下的目錄和檔案,功能超弱的說(其實應該叫CDocumentFileDialog才對)。
好想自己做一個Dialog啊,就跟PC上一樣,可以選擇任務目錄和檔案......
枝節不敘,撿點重要的來囉嗦。
用到一個CListCtrl控制項,來顯示目錄下的檔案,當然表徵圖最好跟系統的一樣,這樣才美觀。
這裡假設m_ListFile就是list控制項,m_ImlSys為CImageList對象,都為對話方塊的成員變數。代碼如下:
HIMAGELIST hImlSys;
SHFILEINFO ssfi;
memset(&ssfi,0,sizeof(ssfi));
hImlSys = (HIMAGELIST)SHGetFileInfo(
_T("hello"),
0,
&ssfi,
sizeof(SHFILEINFO),
SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
m_ImlSys.Attach(hImlSys);
m_ListFile.SetImageList(&m_ImlSys, LVSIL_SMALL);
這樣把系統的小表徵圖(SHGFI_SMALLICON)都載入到了m_ImlSys。這些代碼在Dialog的OnInitDialog中實現。"hello"也可以寫成任何值,因為使用了SHGFI_USEFILEATTRIBUTES參數,會忽略第一個參數。還有一個很重要的問題是,在對話方塊退出時,要調用m_ImlSys.Detach()來銷毀資源。不然,很可能退出對話方塊後,連繫統"開始"的的表徵圖都看不到了。
CListCtrl的InsertItem可以指定顯示表徵圖的索引(即表徵圖在CImageList中的位置)。那麼,怎麼得到這個索引值呢?
還是使用SHGetFileInfo函數,如下:
SHFILEINFO ssfi;
SHGetFileInfo(pszFileName, 0, &ssfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
ssfi.iIcon就是我們要的值。在這裡,pszFileName請指定檔案的整個路徑(包括尾碼名)。