MFC中ShellManager的使用

前端之家收集整理的这篇文章主要介绍了MFC中ShellManager的使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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


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


有的时候,我们需要枚举某个文件件的某种类型的文件,例如,在酷狗播放器中,添加歌曲的时候,有一个选项就是从文件添加,选中一个包含了mp3文件文件夹,然后就可以枚举获取所有这个文件加下的mp3文件,而不用通过打开文件对话框去获取文件的路径。

MFC默认其实就添加了对ShellManager的支持,为什么这么说呢,我们先来看在基于对话框的mfc程序中,在app类的InitInstance函数中有这样一句:


如果你建立的对话框是继承与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",就可以枚举这个文件夹下的存在的文件


好了,今天就说这么多了!!

有关本文的代码http://download.csdn.net/detail/xinzhiyounizhiyouni/7082807

http://www.panshy.com/article/Sort_Desktop/SystemDev/2012-03-21/278.php

猜你在找的Bash相关文章