这篇笔记基于对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控件,如果不看别人的代码还真不知道从哪里可以学到,其它的都是体力活.