在本演练中,你将创建类似于文件资源管理器的应用程序。 你将创建一个包含两个窗格的窗口。 左窗格将保存一个 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_CREATEWindows 消息。 打开 “类视图 ”窗口并选择该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++示例。