MFC中ShellManager的使用

简单的介绍一下,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",就可以枚举这个文件夹下的存在的文件:

VC做的聊天小程序 // Chat.cpp : 定义应用程序的类行为。 // #include "stdafx.h" #include "Chat.h" #include "ChatDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CChatApp BEGIN_MESSAGE_MAP(CChatApp, CWinApp) ON_COMMAND(ID_HELP, &CWinApp::OnHelp) END_MESSAGE_MAP() // CChatApp 构造 CChatApp::CChatApp() { // 支持重新启动管理器 m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART; // TODO: 在此处添加构造代码, // 将所有重要的初始化放置在 InitInstance } // 唯一的一个 CChatApp 对象 CChatApp theApp; // CChatApp 初始化 BOOL CChatApp::InitInstance() { // 如果一个运行在 Windows XP 上的应用程序清单指定要 // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式, //则需要 InitCommonControlsEx()。否则,将无法创建窗口。 INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(InitCtrls); // 将它设置为包括所有要在应用程序使用的 // 公共控件类。 InitCtrls.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&InitCtrls); CWinApp::InitInstance(); if(!AfxSocketInit()) { AfxMessageBox(_T("加载套接字库失败!")); return FALSE; } AfxEnableControlContainer(); // 创建 shell 管理器,以防对话框包含 // 任何 shell 树视图控件或 shell 列表视图控件。 CShellManager *pShellManager = new CShellManager; // 标准初始化 // 如果未使用这些功能并希望减小 // 最终可执行文件的大小,则应移除下列 // 不需要的特定初始化例程 // 更改用于存储设置的注册表项 // TODO: 应适当修改该字符串, // 例如修改为公司或组织名 SetRegistryKey(_T("应用程序向导生成的本地应用程序")); CChatDlg dlg; m_pMainWnd = &dlg; INT_PTR nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: 在此放置处理何时用 // “确定”来关闭对话框的代码 } else if (nResponse == IDCANCEL) { // TODO: 在此放置处理何时用 // “取消”来关闭对话框的代码 } // 删除上面创建的 shell 管理器。 if (pShellManager != NULL) { delete pShellManager; } // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序, // 而不是启动应用程序的消息泵。 return FALSE; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值