在本演练中,你将创建类似于文件资源管理器的应用程序。 你将创建一个包含两个窗格的窗口。 左窗格将保存一个 CMFCShellTreeCtrl 对象,该对象在分层视图中显示桌面。 右窗格将保留一个 CMFCShellListCtrl,该 CMFCShellListCtrl 显示左窗格中所选文件夹中的文件。
先决条件
在 Visual Studio 2017 及更高版本中,MFC 支持是可选组件。 若要安装它,请从 Windows“开始”菜单打开 Visual Studio 安装程序。 找到正在使用的 Visual Studio 版本,然后选择 “修改 ”按钮。 确保选中 “使用 C++ 进行桌面开发 ”磁贴。 在 “可选组件”下,选中 “MFC 支持 ”按钮。
本演练假定已将 Visual Studio 设置为使用 常规开发设置。 如果使用的是其他开发设置,则默认情况下可能不会显示在本演练中使用的一些 Visual Studio 窗口。
使用 MFC 应用程序向导创建新的 MFC 应用程序
这些步骤因所使用的 Visual Studio 版本而异。 若要查看 Visual Studio 首选项的文档,请使用“版本”选择器控件。 它位于此页面上目录表的顶部。
在 Visual Studio 中创建 MFC 项目
在主菜单中,选择“文件”“新建”>“项目”,打开“创建新项目”对话框>。
在顶部的搜索框中,键入 MFC ,然后从结果列表中选择 MFC 应用 。
单击 “下一步” 。 在下一页中,输入项目的名称,并根据需要指定项目位置。
选择“创建”按钮创建项目。
显示 MFC 应用程序向导后,请使用以下选项:
选择左侧 的应用程序类型 。 然后选择 “单个文档 ”并选择“ 文档/视图体系结构支持”。 在“项目”样式下,选择 Visual Studio,然后从“视觉样式和颜色”下拉列表中选择 Office 2007(蓝色主题)。
在“ 复合文档支持 ”窗格中,选择“ 无”。
不要对 “文档模板属性 ”窗格进行任何更改。
在 “用户界面功能 ”窗格中,确保已选择“ 使用菜单栏和工具栏 ”选项。 保留所有其他选项。
在“ 高级功能 ”窗格中,选择 “ActiveX 控件”、“ 通用控件清单”和 “导航”窗格 选项。 其他所有内容保持原样。 导航 窗格 选项将导致向导在窗口左侧创建已
CMFCShellTreeCtrl
嵌入的窗格。我们不会对 “生成的类 ”窗格进行任何更改,因此单击“ 完成 ”创建新的 MFC 项目。
在 Visual Studio 2017 或更早版本中创建 MFC 项目
使用 MFC 应用程序向导 创建新的 MFC 应用程序。 若要运行向导,请在“ 文件” 菜单中选择“ 新建”,然后选择“ 项目”。 将显示“ 新建项目 ”对话框。
在“新建项目”对话框中,展开“项目类型”窗格中的“Visual C++”节点,然后选择“MFC”。 然后,在 “模板 ”窗格中,选择 MFC 应用程序。 键入项目的名称,例如
MFCShellControls
,然后单击“ 确定”。显示 MFC 应用程序向导后,请使用以下选项:
在 “应用程序类型 ”窗格的 “应用程序类型”下,清除 Tabbed 文档 选项。 接下来,选择 “单个文档 ”并选择“ 文档/视图体系结构支持”。 在“项目”样式下,选择 Visual Studio,然后从“视觉样式和颜色”下拉列表中选择 Office 2007(蓝色主题)。
在“ 复合文档支持 ”窗格中,选择“ 无”。
不要对 “文档模板字符串 ”窗格进行任何更改。
在 “数据库支持 ”窗格(Visual Studio 2015 和更早版本)上,选择 “无 ”,因为应用程序不使用数据库。
在 “用户界面功能 ”窗格中,确保已选择“ 使用菜单栏和工具栏 ”选项。 保留所有其他选项。
在“ 高级功能 ”窗格的“ 高级功能”下,仅选择 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 消息。 打开 “类视图 ”窗口并选择该CMFCShellControlsView
类。 右键单击并选择“属性”。接下来,在 “类向导”中,单击“ 消息 ”选项卡。向下滚动,直到找到
WM_CREATE
消息。 从旁边的WM_CREATE
下拉列表中选择 <“Add> OnCreate”。 该命令为我们创建消息处理程序,并自动更新 MFC 消息映射。在方法中
OnCreate
,我们现在将创建对象CMFCShellListCtrl
。OnCreate
在MFCShellControlsView.cpp源文件中找到方法定义,并将其实现替换为以下代码: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::SetRelatedList 方法连接
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
类调用方法,因此必须在MFCShellControlsView.cpp源文件顶部添加指令#include
:#include "MainFrm.h"
通过生成并运行应用程序来验证其是否已成功创建。 若要生成应用程序,请从“ 生成 ”菜单中选择“ 生成解决方案”。 如果应用程序成功生成,请从“调试”菜单中选择“开始调试”来运行它。
现在,应该会在视图窗格中看到所选
CMFCShellTreeCtrl
项目的详细信息。 单击该CMFCShellTreeCtrl
节点时,CMFCShellListCtrl
将自动更新该节点。 同样,如果双击该CMFCShellListCtrl
文件夹中的文件夹,则应自动更新。CMFCShellTreeCtrl
右键单击树控件或列表控件中的任何项。 获得与使用真实 文件资源管理器时相同的上下文菜单。
后续步骤
该向导创建了一个 Outlook 栏,其中包含 “文件夹 ”窗格和 “日历 ”窗格。 在资源管理器窗口中拥有“日历”窗格可能没有意义,因此立即删除该窗格。
支持
CMFCShellListCtrl
以不同模式查看文件,例如 大图标、 小图标、 列表和 详细信息。 更新应用程序以实现此功能。 提示:请参阅 视觉C++示例。