创建你的第一个 MFC 文档/视图应用程序






4.28/5 (26投票s)
一个简短的循序渐进的教程,演示了如何使用 MFC 文档/视图架构创建基于 SDI 和 MDI 的应用程序。
引言
使用 MFC 文档/视图架构创建应用程序可以节省时间,可以帮助你创建更结构化的程序,还可以帮助你减轻许多可能被迫编写的繁琐样板代码。但是,它也可能迫使你以一种不太适合你试图解决的问题(例如游戏)的方式来构建你的应用程序,并且还意味着你被迫承担使用 MFC 运行时库的开销。如果你确信你的用户已经安装了 MFC 版本,或者你不介意将其包含在安装程序中,并且你不介意可执行文件比等效的 Win32/SDK 版本稍大一些,那么 MFC 可以为你节省大量时间。
MFC 文献中经常提到的文档/视图架构只是指将应用程序的数据存储和操作逻辑与数据可视化逻辑分离的做法。基本上,你有一个派生自 CDocument
的类来加载、操作和存储你的数据,以及一个派生自 CView
的类来显示数据。你的文档和视图类(你可以在单个应用程序中拥有多个文档和多个视图类)通过你的主应用程序(派生自 CWinApp
)的内部 MFC 类连接在一起,并在屏幕上由主框架(派生自 CFrameWnd
或 CMDIChildWnd
)类进行物理管理。
在单文档界面 (SDI) 应用程序中,有一个 CFrameWnd
类和一个视图。每次加载文档时,都会清除视图并使用新文档中的信息重新绘制。视图基本上会被重用。
下图显示了一个典型的 SDI 应用程序。主窗口包含菜单、工具栏、状态栏和视图窗口。菜单、工具栏、状态栏由 CFrameWnd
类创建和拥有。你可以创建完整的应用程序而无需触及框架类。
CView
类的显示区域是图像中显示的虚线部分。每次该区域需要重绘时,都会调用类的 OnDraw
方法,并且期望视图查询其关联的文档,以便知道要绘制什么。
在多文档界面 (MDI) 应用程序中,每个应用程序都有一个主框架(在这种情况下是 CMDIFrameWnd
),每个文档都有一个派生自 CMDIChildWnd
的子框架。
每次打开新文档时,都会在应用程序的主 CMDIFrameWnd
窗口中创建一个新的 CMDIChildWnd
。主框架窗口包含并拥有菜单、工具栏和状态栏,而每个 CMDIChildWnd
窗口则包含一个视图窗口。当你在不同的子框架之间切换时,主框架会自动更新菜单和工具栏,以匹配当前子框架内视图的菜单和工具栏。
在 Visual Studio .NET 中,还有一个第三个选项,会在每次打开新文档时创建一个新的 CFrameWnd
。此选项在此处暂不涵盖。
需要注意的是,每个视图只能与一个文档和一个框架窗口关联。CMDIFrameWnd
窗口包含零个或多个 CMDIChildWnd
窗口,而每个 CFrameWnd
或 CMDIChildWnd
包含一个 CView
窗口。但是,一个文档可以有多个关联的视图。一个典型的例子是拆分窗口,它可以被拆分以显示同一文档的两个不同视图。
创建应用程序
创建 MFC 文档/视图应用程序非常简单。启动 AppWizard (文件 | 新建...) 并按照说明进行操作。
首先,我们选择 MFC AppWizard。
选择 MDI 或 SDI(对话框式应用程序已在其他地方介绍过),然后单击“下一步”,直到进入第 4 步。
此步骤允许你自定义许多内容,包括工具栏、菜单、状态栏和打印预览。选中复选框即可免费获得所有这些!一个重要的步骤是“高级”按钮。这允许你指定你的应用程序将默认打开的文件扩展名 - 如果用户双击该类型的文件,Windows Shell 将使用该扩展名与你的应用程序关联。
在这里,我只输入了“my”作为我的文件扩展名。程序编译并首次运行时,所有 .my 文件将具有 IDR_MYSDIATYPE
资源指定的图标(实际的资源名称显然会随着你的应用程序名称而改变)。
继续单击“下一步”,你将进入最后一步,可以选择所需的视图类型。MFC 提供了大量的 CView
派生类型,可以使生活更轻松,包括 HTML 查看器、滚动视图、封装通用控件的视图以及对话框类型的表单视图。
向导完成后,你就拥有了一个可以立即编译和运行的应用程序。它可能不会执行任何有用的功能,但从某种意义上说,它已经做了很多工作:工具栏、状态栏、菜单、打印和打印预览以及文件类型注册。剩下的就是填写你的文档(Serialize
将加载和保存文档,OnNewDocument
将被调用以创建新文档)和你的视图(OnDraw
用于绘图,OnInitialUpdate
用于在视图首次创建时初始化变量)的细节。
要自定义菜单、图标和工具栏,只需使用 Visual Studio 提供的资源编辑器即可。生活变得更轻松了。
延伸阅读
有关更多教程,请查看
- 创建你的第一个 Windows 应用程序 - Daniel Kopitchinski
一个简短的循序渐进的教程,演示了如何创建不使用 MFC 文档/视图架构的基于 SDI 的应用程序。 - 初学者对话框式应用程序指南 - 第一部分 - Dr. Asad Altimeemy
初学者对话框式应用程序指南 - 第二部分 - Dr. Asad Altimeemy
一个循序渐进的教程,展示了如何使用 MFC 创建你的第一个 Windows 程序。 - Windows 消息处理 - 第一部分 - Daniel Kopitchinski
介绍基本的 Windows 消息,如 WM_SIZE 和 WM_CLOSE,以及如何添加你自己的处理程序