這篇筆記基於對Delphi 7內建ShellControl原始碼的分析,看了不少MFC實現的類Explorer裡的Shell控制項,BCG,CjLib的,但都沒有Delphi的Shell控制項做的完美,比如TShellListView可以自動取得系統中語言相關的字元,如"名稱","大小","修改日期",在英文系統中自變成"Name","Size",感覺很不錯!分析一下它的代碼,寫下關鍵的地方,防止忘記,現在記憶力大不如前了啊.
1.得到案頭檔案夾對象的IShellFolder介面,後面的操作都依賴它
SHGetDesktopFolder
2.由檔案(夾)名得到IDLIST,Shell編程裡很多操作都要IDLIST
IShellFolder::ParseDisplayName
3.由IDLLIST得到IShellFolder對象介面
IShellFolder::BindToObject
4.由IDLIST得到顯示名字,如C盤可能顯示為"系統硬碟(c:)"
IShellFolder::GetDisplayNameOf,StrRetToStr
5.枚舉檔案夾內容,如檔案和子目錄等
IShellFolder::EnumObjects
6.由IDLIST或檔案(夾)名取得系統映像列表,及其它資訊
SHGetFileInfo
可以為CTreeCtrl,CListCtrl及CComboBoxEx設定取得的各ImageLists
我想這裡應該使用CustomDraw,在ItemData裡設定IDLIST,在GetDispInfo
裡返回各檔案(夾)對象對應的ImageList索引,在介面上顯示出來.
7.得到語言相關的Column標題
7.1 從案頭檔案夾物件查詢IShellFolder2介面,QueryInterface
7.2 IShellFolder2::GetDetailsOf
7.3 重上兩步直到GetDetailsOf調用失敗
8.使用Shell右鍵菜單
8.1 GetUIObjectOf取得IContextMenu對象
8.2 建立一個快顯功能表CreatePopupMenu
8.3 查詢ContextMenu,IContextMenu::QueryContextMenu
8.4 TrackPopupMenu快顯功能表加TPM_RETURNCMD參數
8.5 根據返回的CommandID填寫CMINVOKECOMMANDINFO結構
8.6 執行IContextMenu::InvokeCommand
就這些步驟比較關鍵,組合起來就可以做出Shell控制項,如果不看別人的代碼還真不知道從哪裡可以學到,其它的都是體力活.