也许大家看到这个题目,未曾进行windows shell编程的同学呢,会不明白是什么意思,这里简单的介绍一下,windows shell就是可以使编写的程序与系统关联(如快捷方式,托盘图标等),管理系统资源(如文件,文件夹等)的编程方式。在说的简单一点,就是通过编程控制windows系统的各种行为以及外观,对windows系统进行各种操作和设置。在windows中的所有资源,主要是文件和文件夹,在windows中是通过shell名字空间来管理,windows系统的每个文件和文件夹都在shell名字空间中有一个唯一的标示符,叫PIDL,通过它可以唯一标示一个系统资源,但是对于我们普通用户来说,是通过全路径在定位一个文件,如c:/hello.mp3.这两者之间可以进行转换。

上面大概对Shell编程的理解,ShellManager主要就是用来获取系统中某个文件夹的路径而使用,在Win32中的使用是比较麻烦的,在mfc中,它的使用就很简单了,主要通过类CShellManager来管理的,首先来看看界面,认识一下ShellManager,如下图:

有的时候,我们需要枚举某个文件件的某种类型的文件,例如,在酷狗播放器中,添加歌曲的时候,有一个选项就是从文件夹添加,选中一个包含了mp3文件的文件夹,然后就可以枚举获取所有这个文件加下的mp3文件,而不用通过打开文件对话框去获取文件的路径。<喎�"/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+TUZDxKzIz8bkyrW+zcztvNPBy7bUU2hlbGxNYW5hZ2VytcTWp7PWo6zOqsqyw7TV4sO0y7XE2KOsztLDx8/IwLS/tNTau/nT2rbUu7C/8rXEbWZjs8zQ8tbQo6zU2mFwcMDgtcRJbml0SW5zdGFuY2W6r8r91tDT0NXi0fnSu77ko7o8L3A+CjxwPjxpbWcgc3JjPQ=="/uploadfile/Collfiles/20140323/20140323091305203.jpg" alt="\">

如果你建立的对话框是继承与CWinapp的,会有这么一句,如果你的对话框是基于CWinAppEx的,那么就不用我们手动创建,而是在继承于CWinAppEx的类的Initinstance中调用InitShellManager(),由框架为我们创建,这种创建方式,只要我们在需要使用到ShellManager的地方,就是用GetShellManager函数就会返回它的指针,就可以进行使用。

下面我们来讲使用,首先我建立了一个对话框,然后添加了一个按钮,名称为ShellManager的按钮,我打算在点击这个按钮的时候,显示一个ShellManager。如下图:

然后再看看按钮的处理,我添加代码要显示一个ShellManager对话框获取某个文件夹的路径,并用消息框显示出来,代码如下:

现在运行,效果如下图:

这样就可以获取指定的文件夹了,另外,我们还可以在设置root(根)节点的位置,这样,就一开始会显示该目录一下的文件夹。比如,我在这里设置G:\Kugou。代码修改如下:

然后再次运行,效果如下:

另外还有许多标记可以设置,来控制它的特征行为。

上面我使用的是继承与CWinAppEx的app类的初始化ShellManager的方式来使用的,如果我使用继承与CWinApp类的初始化方式,我就要自己实例化CShellManager对象。然后将对象指针作为app类的成员,然后在我们之后就可以调用,如声明一个成员用来保存CShellManager对象:

然后在Initinstance中进行初始化:

在程序结束的时候,要删除对象:

在程序使用:

这样的效果和前面的就是一样,不同的是如果我们使用前面那种方法,就是继承与CWinAppEx的方式,我们就只管用,程序结束时,也不用我们销毁对象,如果使用CWinAppEx,就不要在Initinstance中用new的方式自己创建对象,否则会出现程序崩溃的错误。

下面,我就是用上面获取的文件夹路径写一个枚举指定文件夹中文件的程序,首先利用CShellManager的方法ItemFromPath将获取的路径转换为PIDL。然后再枚举其中所选择的文件夹中的文件。如下图:

选取一个文件夹,这里我选择G:\mp3文件夹,点击确定:

然后选择"枚举item",就可以枚举这个文件夹下的存在的文件:

关于 CShellManager 的作用的更多相关文章

  1. if __name__== "__main__" 的意思(作用)python代码复用

    if __name__== "__main__" 的意思(作用)python代码复用 转自:大步's Blog  http://www.dabu.info/if-__-name__ ...

  2. (转载)linux下各个文件夹的作用

    linux下的文件结构,看看每个文件夹都是干吗用的/bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的基 ...

  3. github中的watch、star、fork的作用

    [转自:http://www.jianshu.com/p/6c366b53ea41] 在每个 github 项目的右上角,都有三个按钮,分别是 watch.star.fork,但是有些刚开始使用 gi ...

  4. web.xml中welcome-file-list的作用

    今天尝试使用struts2+ urlrewrite+sitemesh部署项目,结果发现welcome-file-list中定义的欢迎页不起作用: <welcome-file-list> & ...

  5. web.xml中load-on-startup的作用

    如下一段配置,熟悉DWR的再熟悉不过了:<servlet>   <servlet-name>dwr-invoker</servlet-name>   <ser ...

  6. SQLSERVER中NULL位图的作用

    SQLSERVER中NULL位图的作用 首先感谢宋沄剑提供的文章和sqlskill网站:www.sqlskills.com,看下面文章之前请先看一下下面两篇文章 SQL Server误区30日谈-Da ...

  7. 电容与EMC-电容不同功能时对整板EMC的作用

    一般我们的pcb板的器件有很多种类,但是值得特别关注的,很多人都会说是BGA.接口.IC.晶振之类,因为这些都是layout功能模块以及设计难点.然而数量上占绝对优势的器件却是阻容器件,之前围殴阻抗时 ...

  8. FTP的搭建与虚拟目录作用<之简单讲解>

    操作系统:win7 VS2010编写WebService与在IIS的发布<之简单讲解>中我已经说了IIS安装与使用,不明白的可以跳过去看. 1.添加FTP站点 2. 3. 4. 5. zq ...

  9. 火狐浏览器中event不起作用解决办法--记录(一)

    今天遇到了这个问题.IE,谷歌下都没问题,但在FF下却不起作用,很郁闷查了半天,看别人博文写了老长,结果试了要么起作用,但太麻烦,要么不起作用,说了那么多跟没说一样. 其实只要这一句代码就行:e=ar ...

随机推荐

  1. python学习笔记:python简介和入门

    编程语言各有千秋.C语言适合开发那些追求运行速度.充分发挥硬件性能的程序.而Python是用来编写应用程序的高级编程语言. Python就为我们提供了非常完善的基础代码库,覆盖了网络.文件.GUI.数 ...

  2. Django 模型层关系映射

    一.一对一映射 1.什么是一对一 A表中的一条记录只能与B表中的一条记录相关联如:一夫一妻制 2.语法 允许在关联的两个类的任何一个类中 增加: 属性 = models.OneToOneField(E ...

  3. filter-method 在elementUI 表格中的使用

    <el-table-column prop="pubArea" // 表格data 中对应的字段 column-key="pubArea" // 过滤条件 ...

  4. Spring Boot中普通类获取Spring容器中的Bean

    我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,自己动手n ...

  5. 2018-3-5-安装-pip

    title author date CreateTime categories 安装 pip lindexi 2018-3-5 19:4:4 +0800 2018-03-05 18:57:15 +08 ...

  6. bzoj4237稻草人

    题意:给你一个田地,问左下角和右上角有稻草人并且内部除了边界都没有稻草人的矩形数. 标程: #include<bits/stdc++.h> using namespace std; int ...

  7. Java——main()方法

    3.1 main()方法 由于java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public,又因为java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static ...

  8. JVM调优学习 【更新中】

    JVM调优(jdk1.8) 老生常谈,面试吹牛的的最佳谈资,在接下来的几天里,我找了点资料来对其进行一波学习: 本地环境是不需要对我们的虚拟机进行优化的,一般在生产环境下,也就是Linux下才有对JV ...

  9. 【Redis】分布式锁RedLock

    普通实现 说道Redis分布式锁大部分人都会想到: 1.setnx+lua, 2.setkey value px milliseconds nx. - 获取锁(unique_value可以是UUID等 ...

  10. Python:验证码识别

    说明:此验证方法很弱,几乎无法识别出正确的验证码