XImageDialog,带图像预览的打开文件对话框
2009-03-24 14:30
274 查看
现在很多程序打开文件时都带图像预览,比如 QQ 也有,但是功能很弱,唯一我觉得还比较可以的,就是 Axialis IconWorkshop,它还可以支持从 .exe .dll .ocx 中提取图标来进行预览,不过人家是商业软件,要 $ 的。俺是要钱没有,烂命一条,自己动手,丰衣足食:)
先把最终的效果图拿出来看看:
自己动手开发过程中,才发现其实要解决的问题还是挺多的,首先是继承 CFileDialog 的问题,解决控件位置的布局,要随窗口大小变化而保持相对位置不对;然后是要核心功能,要突出自己的亮点:我自己开发的预览,可以支持动态 GIF 预览!这一点是 Axialis IconWorkshop 和 Photoshop 暂时都还没有做到的,还可以调整预览时的背景色,方便查看图像。当然,要支持动态 GIF,MFC 内置的 CImage 已经不可用了,必须自己拿 GDI+ 起家,获取对象类型,判断是 GIF 动画之后起线程以显示动态连续画面,从而构成动画。
至于动态调整背景色,本来是想采用 CMFCColorButton 的,但是这个鬼东西,在常规对话框上都好好的,就是用在 CCommonDialog 的派生类上就会有问题,表现在:下拉出来的颜色面板,在失去鼠标焦点时没能关闭,点程序其他任何地方都不响应,必须选择一种颜色才能关闭。猜测可能是由于 capture 鼠标造成的,查看源代码,果不其然。于是为了解决这个问题,尝试自己派生 CMFCColorButton,处理 WM_CAPTURECHANGED 和 WM_KILLFOCUS 消息,向它的子窗口,调色面板,发送 WM_CLOSE 消息。这个问题表面上是解决了,但是随之而来的是, 测试的时候发现如果禁用 m_bAutoFocus 都可以,但是如果启用 m_bAutoFocus,也就是默认调色板获得焦点,这时候又会出一堆 ASSERT 错误,烦啊烦,想想如果没有安装 Visual Studio 2008 sp1,界面还显示不正常了,干脆懒得折腾了,另想其他办法。看到左边的标准空间,于是决定采用 CToolBarCtrl,自动判断编译环境,是采用 BCG 样式的颜色选择框还是操作系统内置的颜色选择框。这个问题才算解决。顺便给 CToolBarCtrl 加了个 ToolTip。
总结一下,自己开发的这个功能点的优缺点:
1、格式广泛,GDI+ 支持的图像都能预览;
2、支持 GIF 动画预览;
3、支持动态更改预览背景色;
4、界面还算比较清爽,个人的一贯风格:)
5、支持初始化指定视图模式:图标、缩略图等(系统默认为列表显示);
6、支持初始化时指定初始预览图像,可用于保存对话框(QQ 的暂不支持);
7、暂不支持 .exe .dll 中提取图标进行预览,因为没想要继续开发下去,毕竟 GDI+ 支持的图像格式已经很广了;当然,如果以后要进一步完善,也可以继续;
暂时就只想到这么多,发上来留个纪念一下。
hoho,今天有时间,来继续修改完善了一下,加了两个图标,上一页和下一页,用于显示多帧图像(TIF),以支持手动翻页。上图:
先把最终的效果图拿出来看看:
自己动手开发过程中,才发现其实要解决的问题还是挺多的,首先是继承 CFileDialog 的问题,解决控件位置的布局,要随窗口大小变化而保持相对位置不对;然后是要核心功能,要突出自己的亮点:我自己开发的预览,可以支持动态 GIF 预览!这一点是 Axialis IconWorkshop 和 Photoshop 暂时都还没有做到的,还可以调整预览时的背景色,方便查看图像。当然,要支持动态 GIF,MFC 内置的 CImage 已经不可用了,必须自己拿 GDI+ 起家,获取对象类型,判断是 GIF 动画之后起线程以显示动态连续画面,从而构成动画。
至于动态调整背景色,本来是想采用 CMFCColorButton 的,但是这个鬼东西,在常规对话框上都好好的,就是用在 CCommonDialog 的派生类上就会有问题,表现在:下拉出来的颜色面板,在失去鼠标焦点时没能关闭,点程序其他任何地方都不响应,必须选择一种颜色才能关闭。猜测可能是由于 capture 鼠标造成的,查看源代码,果不其然。于是为了解决这个问题,尝试自己派生 CMFCColorButton,处理 WM_CAPTURECHANGED 和 WM_KILLFOCUS 消息,向它的子窗口,调色面板,发送 WM_CLOSE 消息。这个问题表面上是解决了,但是随之而来的是, 测试的时候发现如果禁用 m_bAutoFocus 都可以,但是如果启用 m_bAutoFocus,也就是默认调色板获得焦点,这时候又会出一堆 ASSERT 错误,烦啊烦,想想如果没有安装 Visual Studio 2008 sp1,界面还显示不正常了,干脆懒得折腾了,另想其他办法。看到左边的标准空间,于是决定采用 CToolBarCtrl,自动判断编译环境,是采用 BCG 样式的颜色选择框还是操作系统内置的颜色选择框。这个问题才算解决。顺便给 CToolBarCtrl 加了个 ToolTip。
总结一下,自己开发的这个功能点的优缺点:
1、格式广泛,GDI+ 支持的图像都能预览;
2、支持 GIF 动画预览;
3、支持动态更改预览背景色;
4、界面还算比较清爽,个人的一贯风格:)
5、支持初始化指定视图模式:图标、缩略图等(系统默认为列表显示);
6、支持初始化时指定初始预览图像,可用于保存对话框(QQ 的暂不支持);
7、暂不支持 .exe .dll 中提取图标进行预览,因为没想要继续开发下去,毕竟 GDI+ 支持的图像格式已经很广了;当然,如果以后要进一步完善,也可以继续;
暂时就只想到这么多,发上来留个纪念一下。
hoho,今天有时间,来继续修改完善了一下,加了两个图标,上一页和下一页,用于显示多帧图像(TIF),以支持手动翻页。上图:
相关文章推荐
- 高精度快速预览打开dwg文件的CAD控件CAD Image DLL介绍及下载
- (转帖)使用OpenFileDialog对话框打开文本文件(写此代码的人应该是有一定功力的程序员,因为代码写的很规范,很容易阅读,很好理解,很好调试)
- 【Python】利用tkFileDialog打开文件对话框
- 黑马程序员_GUI(布局,Frame,事件监听机制,对话框Dialog,菜单,打开和保存文件)
- C# OpenFileDialog打开文件对话框(详解)
- 在打开文件对话框上实现图象预览
- 高精度快速预览打开dwg文件的CAD控件CAD Image DLL介绍及下载
- 黑马程序员_GUI(布局,Frame,事件监听机制,对话框Dialog,菜单,打开和保存文件)
- 在打开文件对话框上实现图象预览
- C# 打开文件对话框 OpenFileDialog
- C#打开文件对话框(OpenFileDialog)
- VC 实现文件对话框的图像预览功能
- 利用对话框打开一个图像文件,并显示图片
- 如何找到文件的家-打开文件对话框openFileDialog
- 为“打开文件对话框”增加“预览”功能实例
- wpf "打开文件"对话框(OpenFileDialog)的小笔记
- 高精度快速预览打开dwg文件的CAD控件CAD Image DLL介绍及下载
- OpenFileDialog 打开文件对话框
- 打开文件对话框OpenFileDialog
- Emgu OpenFileDialog()打开图像,分别用Image和Mat CvInvoke.Imread 加载