在本演练中,您将创建类似于文件资源管理器的应用程序。您将要创建一个包含两个窗格的窗口。左窗格将包含显示了您在分层视图桌面的一 CMFCShellTreeCtrl 对象。在中显示文件在左窗格中选择的右窗格将包含 CMFCShellListCtrl 。
系统必备
本演练假定,将 Visual Studio 使用 常规开发设置。如果使用设置不同的开发,本演练使用默认情况下的一些 Visual Studio 窗口可能不会显示。
通过使用MFC应用程序向导,创建新MFC应用程序
使用 MFC 应用程序向导 创建新MFC应用程序。运行向导,从 文件 菜单选择的 新建,然后选择 项目。新建项目 将显示对话框。
在 新建项目 对话框中,展开在 项目类型 窗格的 Visual C++ 节点并选择 *** MFC ***。然后,在 模板 窗格中,选择的 MFC 应用程序。键入项目的名称,例如 MFCShellControls 然后单击 确定。MFC 应用程序向导 将显示。
在 MFC 应用程序向导 对话框中,单击 下一步。应用程序类型 窗格将显示。
在 应用程序类型 窗格中,在 应用程序类型下,清除 选项卡式文档 选项。接下来,选择" 单个文档 并选择的 *** 文档/视图结构支持 ***。在 项目类型,选择下的 Visual Studio和从 *** 视觉样式和颜色 *** 拉列表选择的 Office 2007 (蓝色主题)。保留其他选项,它们。单击显示 复合文档支持 窗格的 下一步 。
在 复合文档支持 窗格中,选择 *** 无 ***。单击 下一步 显示 文档模板字符串 窗格。
不要对 文档模板字符串 窗格的任何更改。单击显示 数据库支持 窗格的 下一步 。
在 数据库支持 窗格中,因为此应用程序不使用数据库,选择 *** 无 *** 。单击显示 用户界面功能 窗格的 下一步 。
在 用户界面功能 窗格中,确保 *** 使用个菜单栏和工具栏 *** 选项。保留其他选项,它们。单击显示 高级功能 窗格的 下一步 。
在 高级功能 窗格中,在 高级功能下,选择仅 ActiveX 控件 和 *** 清单的公共控件 ***。在 高级框架窗格下,选择仅 导航窗格 选项。这将使向导在窗口左侧创建窗格。已经嵌入的 CMFCShellTreeCtrl 。单击显示 生成的类 窗格的 下一步 。
我们不对 生成的类 窗格的任何更改。因此,单击创建新的MFC项目的 完成 。
通过生成并运行应用程序来验证该应用程序已成功创建。生成应用程序,从 生成 菜单选择的 生成解决方案。如果应用程序生成成功,可以从 调试 菜单中选择 启动调试运行应用程序。
向导将自动创建具有标准菜单栏、标准工具栏、标准状态栏和一个Outlook栏位于窗口左侧有 文件夹 视图和 日历 视图的应用程序。
若要添加shell列表控件添加到文档视图
在本节中,将添加 CMFCShellListCtrl 实例添加到向导创建的视图。通过双击中 解决方案资源管理器的MFCShellControlsView.h打开视图标头文件。
在标头文件的顶部附近找到 #pragma once 指令。在其紧下方添加此代码包括 CMFCShellListCtrl的标头文件:
#include <afxShellListCtrl.h>
现在添加类型 CMFCShellListCtrl的成员变量。首先,找到以下注释标头文件:
// Generated message map functions
紧邻该注释添加以下代码:
private: CMFCShellListCtrl m_wndList;
MFC 应用程序向导 在 CMainFrame 选件类中创建了一 CMFCShellTreeCtrl 对象,但是,它是受保护的成员。我们后将访问此对象。因此,此时创建它的访问器。通过双击以打开MainFrm.h标头文件在 解决方案资源管理器。找到以下注释:
// Attributes
在其紧下方,添加以下方法声明:
public: CMFCShellTreeCtrl& GetShellTreeCtrl();
接下来,通过双击以打开MainFrm.cpp源文件在 解决方案资源管理器。在该文件底部,添加下面的方法定义:
CMFCShellTreeCtrl& CMainFrame::GetShellTreeCtrl() { return m_wndTree; }
现在我们更新 CMFCShellControlsView 选件类来处理 WM_CREATE windows消息。打开MFCShellControlsView.h标头文件并单击此代码行:
class CMFCShellControlsView : public CView
接下来,在 属性 窗口中,单击 消息 图标。向下滚动,直到找到 WM_CREATE 消息。从下拉请在 WM_CREATE旁边的列表中,选择 <Add> *** OnCreate ***。这将创建我们的消息处理程序并自动更新MFC消息映射。
在 OnCreate 方法我们现在将创建我们的 CMFCShellListCtrl 对象。查找在MFCShellControlsView.cpp源文件的 OnCreate 方法定义,然后用以下代码替换其实现:
int CMFCShellControlsView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; CRect rectDummy (0, 0, 0, 0); m_wndList.Create(WS_CHILD | WS_VISIBLE | LVS_REPORT, rectDummy, this, 1); return 0; }
重复上面的步骤,但 WM_SIZE 消息的。这将使您的应用程序视图都重绘,只要用户更改应用程序窗口的大小。用下面的代码替换 OnSize 方法的定义:
void CMFCShellControlsView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); m_wndList.SetWindowPos(NULL, -1, -1, cx, cy, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); }
最后一步是连接 CMFCShellTreeCtrl 和 CMFCShellListCtrl 对象使用 CMFCShellTreeCtrl::SetRelatedList 方法。在调用此方法后,CMFCShellListCtrl 将自动显示在 CMFCShellTreeCtrl选定项的内容。我们将执行此操作 OnActivateView 方法,从 CView::OnActivateView重写。
在MFCShellControlsView.h标头文件,在 CMFCShellControlsView 选件类声明中,添加以下方法声明:
protected: virtual void OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView);
接下来,添加此方法的定义。MFCShellControlsView.cpp源文件:
void CMFCShellControlsView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView) { if (bActivate && AfxGetMainWnd() != NULL) { ((CMainFrame*)AfxGetMainWnd())->GetShellTreeCtrl().SetRelatedList(&m_wndList); } CView::OnActivateView(bActivate, pActivateView, pDeactiveView); }
由于我们调用从 CMainFrame 的方法类别,必须添加 #include 指令在MFCShellControlsView.cpp源文件的顶部:
#include "MainFrm.h"
通过生成并运行应用程序来验证该应用程序已成功创建。生成应用程序,从 生成 菜单选择的 生成解决方案。如果应用程序生成成功,可以从 调试菜单中选择 启动调试 运行。
应对在视图窗格中 CMFCShellTreeCtrl 选定的项目现在查看详细信息。在单击 CMFCShellTreeCtrl的节点,将自动更新 CMFCShellListCtrl 。同样,因此,如果您双击" CMFCShellListCtrl的文件夹,应自动更新 CMFCShellTreeCtrl 。
右击所有项树控件或在列表控件。请注意可以获得相同的上下文菜单,就象使用物理文件资源管理器。
后续步骤
向导通过 文件夹 窗格和 日历 窗格创建了一个Outlook栏。它可能没有意义在资源管理器窗口的一个 日历 窗格。因此,现在请移除该窗格。
CMFCShellListCtrl 支持查看文件不同的方案,如 大图标、 小图标、 列表和 详细信息。更新应用程序实现此功能。提示: Visual C++ 示例参见。