在GOPaint的设计研究过程中,我一直希望能够实现这样的结果(A B C 3个步骤)
在我之前的博客里面,曾经有过缩略图显示的现就(http://www.cnblogs.com/jsxyhelu/p/5493329.html   ),也应用到了实际的项目中。但是现在过了一段时间后回头再看,当时的实现放吧是粗糙的。基于MFC已经提供的基础库,通过c++自己的重载机制,应该能够得到精巧的实现,但是肯定需要去重写一些东西。
为了解决问题,达到效果,进行了一些研究。 
一、CMFCShellList和CMFCShellTree基本结合;
这两个控件是新出现的,使用起来比较简单。
 
DIalog的方便之处就在于“所见及所得”,这里绑定控件变量。
在initdialog中添加两句,就能得到效果
    m_ctrlShellList.ModifyStyle(LVS_TYPEMASK, LVS_ICON);
    m_ctrlShellTree.SetRelatedList(&m_ctrlShellList);
Tree的结果和List的结果是级联的。但是显示不了缩略图,只能够显示图标。
二、对CMFCShellList和CMFCShellTree的继承和研究;
如果要更好地使用这两个类,必须首先继承之后使用,在这个过程中,我才能够重写函数和事件:
在原始的mfcshelllistctrl控件中,如果双击其中的文件(图片)的话,是采用默认的打开程序打开文件(图片),那么我要把这个修改成使用我自己的程序来打开图片,所以首先就需要进行CMFCShellListCtrl的重载
#pragma once
#include "afxshelllistctrl.h"
class CGOShellListCtrl :
    public CMFCShellListCtrl
{
public:
    CGOShellListCtrl(void);
    ~CGOShellListCtrl(void);
    DECLARE_MESSAGE_MAP()
    afx_msg void OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult);
};
 
修改OnNMDblclk事件
; i;
}
得到能够显示双击文件绝对地址的目的:
那么下一步,需要将这个地址传入主程序,这个方法很多。
同样,也可以对CMFCShellTreeCtrl进行重载,得到当前的目录地址。
三、但是还是需要显示缩略图;
但是,核心问题还是没有解决,现在还是显示不了缩略图。
一开始我想通过重写List的CUSTOMDRAW事件来达到效果,但是研究一些资料之后,可以修改ListCtrl的样式,却无法修改主要内容。虽然CUSTOMDRAW中也提供了控价重构的机制,但是隐藏在许多宏中,不方便使用;
最后我开始反思之前我的ThumbNail是如何实现的,最后决定还是采用imagelist绑定的方法来解决问题。
这时,可以肯定基本是不用CMFCShellListCtrl了,而是要继承原始的CListCtrl,基本思路就是从CMFCTreeListCtrl中获得路径名称,而后在自定义的List控件中显示出来。并且还要截获List的点击事件,那么获得选择图片的绝对地址。
其实在这个过程中,过滤后缀名等操作也是可以完成的。
四、DLG下的实验
为了进行试验,我首先在DLG下面进行了实验。效果良好:
双击打开图片,感觉速度上面还是有些问题。
这个DLG的例子可以参考附录里面的thumbnail例子,基本就是根据其修改的。
五、融合到GOPaint中去:
GOPaint是我目前正在做的OpenCV图像处理框架库,力图能够提供大中型图像处理软件所需的基础环境。那么缩略图也是必须的一个环节。
采用的是浮动窗口,比较美观。毕竟要把主要区域用出来,显示图片。
在这里融合的时候,我就有意识地将代码进行合并。
对于ListCtrl和CMFCShellTreeCtrl分别进行了重载。这里还是选择了ListCtrl进行重载,因为CMFCShellListCtrl中的优秀特性这里用不起来。
SplitePane继承于CDockablePane,是一个悬浮框类。那么在这个悬浮框中我将
 CGOShellTreeCtrl m_wndTree;
 CGOListCtrl m_ListThumbnail;
 CPaneSplitter m_wndSplitter;
 CImageList m_ImageListThumb;
都放在其中,还包括一些存储用的变量。这样的结果就是如果以后在其他地方需要使用,只需要将这几个文件拷贝过去复用就可以了。
 
#pragma once
#include "afxshelltreectrl.h"
#include "afxshelllistctrl.h"
#include "panesplitter.h"
#include "GOShellTreeCtrl.h"
#include "GOListCtrl.h"
#include "afxwin.h"
#include <vector>
// CSplitePane
class CSplitePane : public CDockablePane
{
    DECLARE_DYNAMIC(CSplitePane)
public:
    CSplitePane();
    virtual ~CSplitePane();
protected:
    DECLARE_MESSAGE_MAP()
public:
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    afx_msg void OnSize(UINT nType, int cx, int cy);
    afx_msg void OnDestroy();
public:
    CGOShellTreeCtrl m_wndTree;
    CGOListCtrl m_ListThumbnail;
    CPaneSplitter m_wndSplitter;
    CPaneToolBar m_wndToolbar;
    CImageList m_ImageListThumb;
    int m_nSelectedItem;
    void DrawThumbnails(void);
    std::vector<CString> m_VectorImageNames;
    BOOL GetImageFileNames(void);
    void GetThumbnailsAndShow(void);
};
 
 
具体的实现代码已经不重要了,因为原理已经讲明白了。这里的代码编写需要对继承、控件等都有一些了解。如果有不清楚的地方可以跟帖讨论。
五、小结:
这样一个效果,前后做了有2天,6-8个小时。我想还需要加强以下几个方面的联系:
1、对VS环境中提供的几个新控件的认识。不仅是能够了解使用,最好是能够找到实现的代码去跟一根。这样以后需要实现自己想要的效果的时候有所依据。
MFC本身是系统的、连贯的。它自己的代码很多时候就是最好的参考;
2、对继承、复用等面向对象基本原理要加强理解。
3、解决问题的方法比结果更重要。这个缩略图的问题可以说我一直就在思考和想解决,最后还是下定决心,达到了预计目的,各中过程也比较漫长。现在反思过来看,还是要紧紧抓住需要解决问题的核心,不要过度耽搁于细节。解决问题的方法一定是有的,相关的资料及时少,也是肯定有帮助的;
4、不断积累。这里探索的过程和探索的结果,将来都会成为很好的基础。
六、参考资料
找到一了一些的例子:
能够直接显示缩略图,但是版本比较老了,很多地方需要修改。
2、http://bbs.csdn.net/topics/390709031 也是提供customeview修改的.
3、codeprojects Thumbnails viewer and image processing using GDI+ and MFC 这篇我跟了一下,效果很好,但是太复杂。
3、最后还是在自己的以前看过的代码里面找到了最合适的例子 thumbnail。原始链接可能是codeprojects上的,这里直接放出代码。
4、如果想学习DockPane,那么codeprojects Understanding CDockablePane  这篇是最好的
感谢阅读至此,希望有所帮助。

CMFCShellList和自定义ShellList结合使用,达到“直接浏览缩略图,双击打开图片”的更多相关文章

  1. android 自定义scrollview 仿QQ空间效果 下拉伸缩顶部图片,上拉回弹 上拉滚动顶部title 颜色渐变

    首先要知道  自定义scrollview 仿QQ效果 下拉伸缩放大顶部图片 的原理是监听ontouch事件,在MotionEvent.ACTION_MOVE事件时候,使用不同倍数的系数,重置布局位置[ ...

  2. JAVA之旅(二十六)——装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片

    JAVA之旅(二十六)--装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片 一.装饰设计模式 其实我们自定义re ...

  3. Android布局自定义Shap圆形ImageView,可以单独设置背景与图片

    一.图片预览:                  一.实现功能: 需求要实现布局中为圆形图片,图片背景与图标分开且合并到一个ImageView. 二.具体实现: XML中布局中定义ImageView, ...

  4. VS自定义项目模板:[2]创建VSIX项目模板扩展

    VS自定义项目模板:[2]创建VSIX项目模板扩展 听语音 | 浏览:1237 | 更新:2015-01-02 09:21 | 标签:软件开发 1 2 3 4 5 6 7 分步阅读 一键约师傅 百度师 ...

  5. 用c#开发微信(5)自定义菜单设置工具 (在线创建)

    读目录 1 使用 2 原理 3. 错误 上次写了<用c#开发微信 (4) 基于Senparc.Weixin框架的接收事件推送处理 (源码下载)>,有园友问到如何创建菜单的问题,今天就介绍下 ...

  6. 关于在SharePoint 2013(2010)中Javascript如何实现批量批准的自定义操作功能?

    1.概述: SharePoint 2013(包括SharePoint 2010)提供了很方便的,多选的界面,但是很多操作还是不能批量进行,比如:批准的功能.如果您要解决方案不关心代码,那么请直接联系作 ...

  7. C# 自定义文件图标 双击启动 (修改注册表)

    程序生成的自定义文件,比如后缀是.test 这种文件怎么直接启动打开程序,并打开本文件呢 1.双击打开 2.自定义的文件,有图标显示 3.自定义的文件,点击右键有相应的属性 后台代码:(如何在注册表中 ...

  8. [MISSAJJ原创]cell内 通过SDWebImage自定义创建动态菊花加载指示器

    最后更新已经放到了github上了 MISSAJJ自己写的一个基于SDWebImage自定义的管理网络图片加载的工具类(普通图片加载,渐现Alpha图片加载,菊花Indicator动画加载) 经常在项 ...

  9. [安卓] 18、一个简单的例子做自定义动画按钮和自定义Actionbar

    在做安卓UI的时候有时候需自定义具有动画效果的按钮或需要自定义一下actionbar~ 本节用一个简单的demo讲如何自定义具有动画效果的按钮,以及个性化的actionbar 下面是效果: 其中: △ ...

随机推荐

  1. SSO单点登录设计

    关键字: 单点登录 SSO Session 单点登录在现在的系统架构中广泛存在,他将多个子系统的认证体系打通,实现了一个入口多处使用,而在架构单点登录时,也会遇到一些小问题,在不同的应用环境中可以采用 ...

  2. sysctl.conf和limit.conf备忘待查

    #################################limits.conf设置################################### #修改最大进程和最大文件打开数限制v ...

  3. Hibernate中sessionfactory和session的多线程问题

    http://blog.sina.com.cn/s/blog_7ffb8dd5010146i3.html

  4. VMVare 桥接上网

    桥接模式设置小解: 第1步 虚拟机下fedora安装好后,打开VM虚拟机的菜单栏,单击编辑------虚拟网络编辑器,选择“主机虚拟网络 映射”标签,然后把VMnet0 手动选择为你本地的物理网卡(要 ...

  5. ASP.NET异步处理

    前一篇:详解 .NET 异步 在前文中,介绍了.NET下的多种异步的形式,在WEB程序中,天生就是多线程的,因此使用异步应该更为谨慎.本文将着重展开ASP.NET中的异步. [注意]本文中提到的异步指 ...

  6. window下Git和github入门

    tip:使用简单的例子来制作一个使用指南过程,默认文件夹为demo.看了3个早晨,写一下留个记录,可能有些不成熟,如有错误欢迎指正. 参考一:http://www.liaoxuefeng.com/wi ...

  7. 弹出式菜单(下拉菜单)实现——PopupMenu

    PopupMenu代表弹出式菜单,它会在指定组件上弹出PopupMenu,默认情况下,PopupMenu会显示在该组件的下方或上方.PopupMenu可增加多个菜单项,并可为菜单项增加子菜单. 使用P ...

  8. centos5.5關閉ssh保留運行的程序

    SSH会话关闭时,ssh所关联的pty关闭,系统会给这个pty所关联的session中的所有进程发送SIGHUP信号, SIGHUP的默认信号处理程序是终止进程,除非进程自己处理了SIGHUP. 解决 ...

  9. 神经网络NN

    神经网络基本模型: 1.前向神经网络:无圈的有向图N=(V,E,W),其中,V为神经元集合,E为连结权值集合,W为每一连结赋予一实值的权重. 神经元集V可以被分成无接受域的输入结点集V1,无投射域的输 ...

  10. vmwvare 网卡设置讲解