加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

ComDlg32 | 通用打开、另存为对话框中文件视图的实质

(2005-05-10 20:05:22)
分类: 技术/开发(原创/转载)
这两个通用对话框中的文件视图,其实用的是WINDOWS资源管理器的文件视图(即资源管理器右侧的视图),粗看起来真是看不出来。。。

看看OpenDlgProc()是怎么实现这一系列功能的。

1 创建

与一般MFC对话框程序一样,文件视图属于对话框子窗口,所以一般在WM_INITDIALOG这个消息中创建子窗口,OpenDlgProc()中也是这样,在WM_INITDIALOG消息的处理中,调用了一个全局函数InitLocation,这个函数负责创建对话框中的所有子窗口,并把状态置为初始化状态。

WINDOWS资源管理器中的文件视图其实是一个COM组件,接口为IShellView,这个组件是由IShellFolder创建生成的,具体程序像下面这样。

IShellFolder * psf;

HWND hwndOwner;

REFIID riid = IID_IShellView;

IShellView * psvNew;

hr = psf->CreateViewObject(hwndOwner, IID_IShellView, (void**)&psvNew)

if (SUCCEEDED(hr))

{

psvNew->CreateViewWindow(...); // 创建文件视图

}

但是在实际用的时候并不是你得到了一个目录的IShellFolder接口就可以创建视图窗口了,你还得在自己的程序中实现一些接口,然与文件视图对象进行消息沟通,这个接口就是IShellBrowser,文件视图对象通过个接口,通知Client它的状态改变或者用户对它进行了一些操作,Client需要相应的更新,比如用户选择了一个文件或几个文件,需要通知资源管理器更新状态栏等,还可以让Client添加一些新的功能,比如资源管理器里面,文件视图对象可以通过这个接口让资源管理器添加一些菜单,工具栏上添加一些按钮,用户点击这些按钮时,资源管理器就调用文件视图对象相应的功能。

所以这两个通用对话框要使用这个文件视图,也必须提供这些接口,所以在ComDlg32里面,添加了一个类CFileOpenBrowser,是仅有的几个类之一,这个DLL中大部分是C函数,工程巨大。

CFileOpenBrowser除了实现IShellBrowser接口之外,还实现了另外的两个接口ICommDlgBrowser2,IServiceProvider。后面一个接口我不太清楚作用,前面一个主要用于刷选文件,比如通用对话框设置了文件类型.jpg,则文件视图中只能显示以.jpg为扩展名的文件,这个接口就是提供这个作用,文件视图对象可以调用这个接口的IncludeObject()函数来判断某个文件是否需要显示,这个函数越简单越好,因为每个文件都需要调用这个函数判断一下,如果某个文件夹有几万个文件,而你这个函数又设计得特复杂,那刷选文件时你就等着吧。这个接口还有几个函数,我没有多作研究,在此也就不作解释了,以免解释错了,那就麻烦了。



未完,待续。。。。

2 显示

3 切换视图模式

4 视图切换下拉菜单

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有