现在的位置: 首页 > 综合 > 正文

XFolderDialog,新式目录选择框

2013年08月26日 ⁄ 综合 ⁄ 共 997字 ⁄ 字号 评论关闭

下面是两个目录选择对话框,作为开发者或最终用户,您愿意使用哪个?

 

图一:

图一

 

图二:

图二

 

一直以来,程序里面使用的目录选择对话框都是如图一所示使用 SHBrowseForFolder。

后来在 CodeProject 上看到一篇文章,Hans Dietrich 发表的 XFolderDialog,派生于 CFileDialog 的目录选择框,创意很不错,看了一下源码,他的代码写的是很不错,思路也比较清晰,不过对于我这样怕麻烦的人而言,一个功能的完成如果需要三四个类才能完成的话,太折腾人了。于是准备借鉴他的创意,自己另起炉灶,做个完善而简单使用方便的组件。

 

首先明确开发思路:

1、本类暂且名称仍定为 XFolderDialog,派生于 CFileDialog;

2、自动判断操作系统类型,为 ofn 的 size 设置 78 还是 88,以期达到在 Win98 和 Win2000 显示的风格一样,都有左边 Explorerbar;

3、设置 Filter 为一串较长随即字符,类似于 CLASSID,以期达到屏蔽文件效果,只显示目录(但是 .lnk 快捷方式文件较为特殊,需要特殊处理);

4、隐藏通用对话框的文件类型标签和下拉框,更改文件标签为文件夹;

5、Hook 打开按钮,更改标题为确定,通过 SetWindowLong 屏蔽掉默认的行为,改为我们期望的返回 IDOK 的结果;

6、重载 OnNotify 虚函数,处理 CDN_SELCHANGE 和 CDN_FOLDERCHANGE 消息,当选定目录时更新显示路径;

7、处理 lst2,也就是最大的那个文件显示列表,使其支持可以指定视图模式(图标、缩略图、列表等)。

 

最终完成的效果就如图二所示。

 

Hans Dietrich 的相比,我的代码的优势在于:

1、他使用对话框模板来创建 FolderDialog,我直接操作 FileDialog,一方面减小可执行文件体积,二也避免不同用户使用不同字体造成同一界面,一部分是标准字体,一部分是对话框模板中的字体,不搭调;

2、他重载了很多的虚函数,使用多个类来 subclasswindow,我直接 hook 控件和消息,只处理必须的消息,代码更简洁而高效,一个 class 全部搞定。

 

当然,我只是按照我自己的想法弥补了一下我认为的缺陷,毕竟,他的这个创意还是相当不错的。Hans Dietrich 在  CodeProject 上著有多篇文章,是个很有思想和创意的 programer,我的榜样。

 

 

抱歉!评论已关闭.