MFC 编程基础 2 文档_视图结构应用程序
MFC文档视图结构-上机步骤
实验1 . MFC对话框应用程序练习一、上机题目:1.一个简单的单文档应用程序——记事本程序2.文档串行化编程3. 简单的班级学生查询系统(单文档多视图编程)二、上机目的:1.通过这些程序可以达到以下目的:2.文档视图框架3.文档、视图、框架之间的相互作用三、题目说明1.记事本程序利用AppWizard,自动产生一个记事本程序。
2. 文档串行化编程1)定义一个日期结构(包括年月日)置于文档对象中,在文档对象中序列化保存和读取,并在视图中显示日期信息(可以在编辑视图或普通视图中显示)。
并通过对话框修改该信息。
注:普通视图中显示文本方法:重载视图OnDraw函数,利用其中pDC->TextOut函数输出相关信息。
2)建立一个表单视图(FormView),在建立控件输入矩形的左上角和右下角,在另外一个控件中显示该视图。
注:视图会话函数:CDC* pDCTemp=m_Ctrl.GetWindowDC(); 得到视图的设备pDCTemp->Rectangle(m_x1,m_y1,m_x2,m_y2); 绘制矩形3.简单的班级学生查询系统1)建立两个视图,其中左边为一个树视图,根节点为为学院(系)(这一级至少要有两个节点如计算机学院、软件学院),二级节点为学院的系(专业)(可以只针对计算机学院输入相关二级节点,如包括网络工程、计算机科学、软件学院),右边为列表视图包含学生的姓名、学号、课程成绩等。
2)要求当选择左边的计算机学院时,右边视图显示所有计算机学院的学生信息,当选择网络工程专业,只选择网络工程专业的学生信息。
提交网站:实现步骤:例1.一个简单的单文档应用程序——记事本程序1. 只要在AppWizard的Step 6将Base Class设置为EditView,AppWizard就自动完成了一个记事本程序的设计:2. 运行程序,即可测试记事本的各种功能:3.说明:(1)打开Workshop中的Class视图,可以看到,一个简单的单文档应用程序向导自动:建立五个类(2(3)每个类的主要函数:void CAboutDlg::DoDataExchange(CDataExchange* pDX)int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)//创建窗体的工具栏,状态栏等BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)BOOL CXxxApp::InitInstance()void CXxxApp::OnAppAbout()BOOL CXxxDoc::OnNewDocument()//初始化文档字符数据、字体信息等void CXxxDoc::Serialize(CArchive& ar)BOOL CXxxView::PreCreateWindow(CREATESTRUCT& cs)void CXxxView::OnDraw(CDC* pDC)BOOL CXxxView::OnPreparePrinting(CPrintInfo* pInfo)//弹出打印对话框void CXxxView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)void CXxxView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)CXxxDoc* CXxxView::GetDocument() // non-debug version is inline例2.文档串行化编程将C++对象以字节流的形式保存在二进制文件中称为对象的串行化处理,经过串行化处理的称为持久对象,可以按需要在程序运行中存储和恢复。
MFC文档视图
应用程序对象
- 10 -
文档/视图框架—文档视图对象的创建过程
...... //注册应用程序的文档模板。 //文档模板将用作文档、框架窗口和视图之间的连接 CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CMytestDoc), RUNTIME_CLASS(CMainFrame), // 主 SDI 框架窗口 RUNTIME_CLASS(CMytestView)); if (!pDocTemplate) return FALSE; AddDocTemplate(pDocTemplate); //分析标准外壳命令、DDE、打开文件操作的命令行 ...... //根据命令行中的信息启动程序 ......
-3-
文档/视图框架—文档/视图结构概述
框架口
文档
文档当前可视部分
文档和视图的关系
-4-
文档/视图框架—文档/视图结构概述
使用文档/视图结构的意义:
将数据操作、数据显示和用户界面分离开。这是一种“分而治之” 的思想,这种思想使得模块划分更加合理、模块独立性更强。
MFC在文档/视图结构上提供了许多标准操作。如新建文件、打 开文件、保存文件、打印等操作,它们被框架自动完成,减轻了 程序员的工作量。
-7-
文档/视图框架—单文档主要类
单文档应用程序框架中,主要包含5个类:
SDICWinApp(应用程序类) CFrameWnd(框架窗口类) CView(视图类) CDocument(文档类) CDocTemplate(类文档模板)
mfc 教程
mfc 教程MFC(Microsoft Foundation Classes)是一种用于开发Windows应用程序的C++框架,由Microsoft推出。
它提供了一系列的类和函数,简化了Windows编程的复杂性,使开发人员可以更轻松地创建各种功能强大且交互性良好的应用程序。
MFC教程的目的是帮助初学者了解MFC的基本概念和使用方法,以便能够利用MFC框架开发自己的Windows应用程序。
本教程将介绍MFC的主要组成部分、常用类以及一些常见的编程技巧,帮助读者快速上手。
第一部分将介绍MFC的基本概念和架构。
我们将了解MFC是如何工作的,包括应用程序对象、文档/视图体系结构和消息映射等主要概念。
我们还将学习如何创建一个简单的MFC应用程序,并进行窗口的创建和管理。
第二部分将深入介绍MFC的常用类。
我们将重点介绍窗口类和控件类,包括CWnd、CFrameWnd、CDialog、CButton等。
我们将学习如何使用这些类创建窗口、控件,并处理用户输入事件。
我们还将讨论一些常见的绘图和动画技术,如GDI绘图和使用定时器实现动画效果。
第三部分将介绍MFC的高级特性和编程技巧。
我们将学习如何使用MFC的文档/视图体系结构创建多文档应用程序,并进行文档的管理和视图的同步更新。
我们还将介绍如何通过自定义类和重载消息处理函数来实现定制化的功能。
此外,我们还将讨论一些高级主题,如线程编程和网络编程。
最后,本教程还将介绍一些常见的MFC开发工具和资源。
我们将介绍MFC的IDE(集成开发环境)和调试工具,并提供一些常用的网站和论坛供读者进一步学习和交流。
总结起来,本教程将帮助读者掌握MFC的基本概念和编程技巧,并能够利用MFC框架开发自己的Windows应用程序。
我们将通过实例和演示代码来讲解,帮助读者理解和应用所学知识。
阅读本教程后,读者将具备一定的MFC编程基础,并能够进一步深入研究和应用MFC框架。
希望本教程能够对MFC初学者有所帮助,让他们更加轻松地学习和掌握MFC编程。
MFC编程基础
9
2 最简单的MFC应用程序
学习MFC程序的组织方式,生成一个工程。 创建工程要点
Win32 Project Empty project 在共享 DLL 中使用 MFC
10
2 最简单的MFC应用程序
学习MFC程序的组织方式,生成一个工程。 创建工程要点
Win32 Project,Empty project,在共享 DLL 中使用 MFC
2 最简单的MFC应用程序
2 最简单的MFC应用程序
13
2 最简单的MFC应用程序
WinMain()函数,由MFC库后台自动提供; CWinApp类:
对基于MFC的程序重要,其对象包括启动、初始化、运行 和关闭应用程序所需的一切代码。 需要由CWinApp派生出工程自己的应用程序类 虚函数InitInstance(),需要重写,包含创建和显示应用程序 窗口的代码,由WinMain()函数调用; 该类继承的其它成员不变。
2014-5-17
26
消息映射例 class CSketcherApp : public CWinAppEx { public: 为了使用消息映射宏,还需要在类声明 的结尾用DECLARE_MESSAGE_MAP宏, CSketcherApp(); 该宏对类实现源文件中所定义的消息映 // 重写 射进行初始化。 public: virtual BOOL InitInstance(); virtual int ExitInstance(); // 实现 UINT m_nAppLook; virtual void PreLoadState(); 用于区分消息处 virtual void LoadCustomState(); 理函数和类中 virtual void SaveCustomState();
轻松玩转MFC文档视图架构编程
// frame windows class CFrameWnd; // standard SDI frame class CMDIFrameWnd; // standard MDI frame class CMDIChildWnd; // standard MDI child class CMiniFrameWnd; // half-height caption frame wnd
这个特性强调了架构的外部特征,即架构具有可学习、可再生、可实例化的特点,是所有基于该架构 所构造实例的共性,是贯串在它们体内的一根"筋",但各个基于该架构所构造的实例彼此是存在差异的。
(2)它是一个由内部有联系的事物所组成的一个有机整体。架构中的内部成员不是彼此松散的,并非 各自"占山为王",它们歃血为盟,紧密合作,彼此都有明确的责任和分工,因此共同构筑了一个统一的基 础性平台、一个统一的模型。譬如,OSI 模型从物理层到应用层进行了良好的合作,虽然内部包含了复杂 的多个层次,但仍然脉络清晰。
在这里,我们再引用几位专家(或企业)关于架构的定义以供读者进一步参考:
The key ideas of a commercial application framework : a generic app on steroids that provides a large amount of general-purpose functionality within a well-planned, welltested, cohesive structure. (Application framework is) an extended collection of classes that cooperate to support a complete application architecture or application model, providing more complete application development support than a simple set of class libraries. ――MacApp(Apple's C++ application framework) An application framework is an integrated object-oriented software system that offers all the application-level classes(documents, views, and commands)needed by a generic application. An application framework is meant to be used in its entirety, and fosters both design reuse and code reuse. An application framework embodies a particular philosophy for structuring an application, and in return for a large mass of prebuilt functionality, the programmer gives up control over many architectural-design decisions. ――Ray Valdes
VS2010之MFC入门到精通教程(1-55全部)
VS2010/MFC编程入门教程之目录第一部分:VS2010/MFC开发环境VS2010/MFC编程入门之前言VS2010/MFC编程入门之一(VS2010与MSDN安装过程图解)第二部分:VS2010-MFC应用程序框架VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)VS2010/MFC编程入门之三(VS2010应用程序工程中文件的组成结构)VS2010/MFC编程入门之四(MFC应用程序框架分析)VS2010/MFC编程入门之五(MFC消息映射机制概述)第三部分:对话框VS2010/MFC编程入门之六(对话框:创建对话框模板和修改对话框属性)VS2010/MFC编程入门之七(对话框:为对话框添加控件)VS2010/MFC编程入门之八(对话框:创建对话框类和添加控件变量)VS2010/MFC编程入门之九(对话框:为控件添加消息处理函数)VS2010/MFC编程入门之十(对话框:设置对话框控件的Tab顺序)VS2010/MFC编程入门之十一(对话框:模态对话框及其弹出过程)VS2010/MFC编程入门之十二(对话框:非模态对话框的创建及显示)VS2010/MFC编程入门之十三(对话框:属性页对话框及相关类的介绍)VS2010/MFC编程入门之十四(对话框:向导对话框的创建及显示)VS2010/MFC编程入门之十五(对话框:一般属性页对话框的创建及显示)VS2010/MFC编程入门之十六(对话框:消息对话框)VS2010/MFC编程入门之十七(对话框:文件对话框)VS2010/MFC编程入门之十八(对话框:字体对话框)VS2010/MFC编程入门之十九(对话框:颜色对话框)第四部分:常用控件VS2010/MFC编程入门之二十(常用控件:静态文本框)VS2010/MFC编程入门之二十一(常用控件:编辑框Edit Control)VS2010/MFC编程入门之二十二(常用控件:按钮控件Button、Radio Button和Check Box)VS2010/MFC编程入门之二十三(常用控件:按钮控件的编程实例)VS2010/MFC编程入门之二十四(常用控件:列表框控件ListBox)VS2010/MFC编程入门之二十五(常用控件:组合框控件Combo Box)VS2010/MFC编程入门之二十六(常用控件:滚动条控件Scroll Bar)VS2010/MFC编程入门之二十七(常用控件:图片控件Picture Control)VS2010/MFC编程入门之二十八(常用控件:列表视图控件List Control 上)VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下)VS2010/MFC编程入门之三十(常用控件:树形控件Tree Control 上)VS2010/MFC编程入门之三十一(常用控件:树形控件Tree Control 下)VS2010/MFC编程入门之三十二(常用控件:标签控件Tab Control 上)VS2010/MFC编程入门之三十三(常用控件:标签控件Tab Control 下)第五部分:菜单、工具栏与状态栏VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)VS2010/MFC编程入门之三十五(菜单:菜单及CMenu类的使用)VS2010/MFC编程入门之三十六(工具栏:工具栏资源及CToolBar类)VS2010/MFC编程入门之三十七(工具栏:工具栏的创建、停靠与使用)VS2010/MFC编程入门之三十八(状态栏的使用详解)第六部分:文档、视图和框架VS2010/MFC编程入门之三十九(文档、视图和框架:概述)VS2010/MFC编程入门之四十(文档、视图和框架:各对象之间的关系)VS2010/MFC编程入门之四十一(文档、视图和框架:分割窗口)第七部分:MFC常用类VS2010/MFC编程入门之四十二(MFC常用类:CString类)VS2010/MFC编程入门之四十三(MFC常用类:CTime类和CTimeSpan类)VS2010/MFC编程入门之四十四(MFC常用类:定时器Timer)VS2010/MFC编程入门之四十五(MFC常用类:CFile文件操作类)VS2010/MFC编程入门之四十六(MFC常用类:MFC异常处理)第八部分:字体和文本输出VS2010/MFC编程入门之四十七(字体和文本输出:CFont字体类)VS2010/MFC编程入门之四十八(字体和文本输出:文本输出)第九部分:图形图像VS2010/MFC编程入门之四十九(图形图像:CDC类及其屏幕绘图函数)VS2010/MFC编程入门之五十(图形图像:GDI对象之画笔CPen)VS2010/MFC编程入门之五十一(图形图像:GDI对象之画刷CBrush)第十部分:Ribbon界面开发VS2010/MFC编程入门之五十二(Ribbon界面开发:创建Ribbon样式的应用程序框架)VS2010/MFC编程入门之五十三(Ribbon界面开发:为Ribbon Bar添加控件)VS2010/MFC编程入门之五十四(Ribbon界面开发:使用更多控件并为控件添加消息处理函数)VS2010/MFC编程入门之前言鸡啄米的C++编程入门系列给大家讲了C++的编程入门知识,大家对C++语言在语法和设计思想上应该有了一定的了解了。
MFC应用程序结构
5.利用fstream类操作文件
操作举例:文件复制 void MyCopy(CString strSource, CString strTarget) { fstream fs, ft; CString str; char cs[200]; fs.open(strSource, ios::in) ; ft.open(strTarget, ios::out) ; while(! fs.eof() ) { fs.getline(cs,sizeof(cs)); str=cs; ft<<str<<endl;; } fs.close(); ft.close(); }
3. 文档视图结构 文档与视图的交互过程 1.CView类的GetDocument()函数 视图类CView的GetDocument()函数返回的是一个 CDocument或其派生类的指针。可用得到的文档指针来 访问文档中的数据。 从而在视图类中,实现文档类的数据与视图类的数据 进行交换。 2. CDocument类的UpdateAllViews()函数 当文档的数据发生了变化后,文档也要通知视图当 前的变化,以让视图能够及时更新,忠于文档的数据。 这样的一件工作是通过文档类中的UpdateAllViews()函 数来实现的。
MFC应用程序结构及开发实例 MFC
1. 创建一个MFC应用程序
1. 创建一个MFC应用程序
1. 创建一个MFC应用程序
2. 运行MFC应用程序
3. 文档视图结构
3. 文档视图结构
文档类继承于CDocument类,它描述了应用的数 据。抽象地说,文档是一个应用程序数据基本元素 的集合,它构成应用程序所使用的数据单元,文档 负责管理和维护应用的数据。 具体一点来说,文档是一种数据源,数据源有很 多种,最常见的是磁盘文件,但是文档不必非要是 一个磁盘文件,文档的数据源也可以来自串行口或 并行口的输入数据。文档对象负责来自所有数据源 的数据的管理。
chapter2 MFC基础
1. MFC类库简介
● MFC基础类库是按照C++类的结构层次进行组织的, 它封装了绝大多数Windows API函数、数据结构和宏, 并提供Windows应用程序常规任务的缺省处理代码。 ● MFC的基类提供了应用程序中的一般功能,由基类 产生的派生类实现各种具体的功能。 ●MFC类库将所有图形用户界面元素以类的方式封装 起来,其文档/视图模型较好的实现了数据与显示的分 离。 ●MFC 应用程序向导(AppWizzard)可以方便的为用户 自动生成应用程序框架 。
为菜单项或控制条按钮的允许或禁上提供支持 为Windows系统的POINT结构提供封装 定义一个静态数据结构以便存放类的属性细节(类型、 诊断等) 对Windows系统的SIZE结构提供封装 支持动态字符集
MFC消息种类
消息机制是 Windows应用程序的 核心,MFC中的消息可以分为: ● Windows消息 ●控件通知消息 ●定时消息 ●命令消息
Windows消息
● Windows消息通常指以WM开头的消息, 但WM_COMMAND除外。 ●键盘消息和鼠标消息都属于Windows消 息,Windows消息由窗口和视图进行处 理。 ● Windows消息通常带有若干个参数传递 给消息处理函数,这些参数为处理函数 正确地处理消息提供了充分的信息。
命令消息
●命令消息是来自于用户界面对象的 WM_COMMAND消息。 ●包括菜单、工具栏按钮和加速键都属于命 令消息等。即每当用户选择一个菜单项、单 击一个按钮或需要告诉操作系统应当执行什 么操作时,则发送一条WM_COMMAND命 令消息。 ● WM_COMMAND 消 息 的 消 息 映 射 宏 为 OnCommand()。所有命令消息都包含有一个 相同类型的参数,即该命令消息需要操作的 资源ID值,由ID值映射消息处理函数。
MFC笔记
文档与视图的关系1。
文档与视图的关系默认情况下,利用MFC应用程序向导创建的应用程序,其主干是文档类和视图类。
MFC 类库中的文档/视图实现将数据本身同其显示分开,并且与用户对数据的操作分离。
数据的所有更改都通过文档类管理。
视图只调用接口来访问和更新数据。
在具有文档/视图结构的应用程序中,MFC文档即为数据源。
文档对象将数据读出或写入永久存储区。
该文档还可能提供到数据所驻留的任何位置(如在数据库中)的接口。
一个单独的视图对象可管理数据显示,包括在窗口中呈现数据,用户选择或编辑数据。
该视图从文档获取显示数据,并将所有数据更改传递回文档。
MFC框架中可见性最大的部分就是文档与视图,它们一起处理用户的输入并绘制结果数据的文本或图形。
文档还承担在数据更改时更新视图的任务。
#defined问题#define AFX_WNDCLASS(s) \_T( "AFX ")_T(s) _T( "42 ") _STA TIC_SUFFIX _UNICODE_SUFFIX _DEBUG_SUFFIX宏定义不但可以定义常量,还可以定义函数.这个就是定义了一个用来联接字符串的函数.当调用AFX_WNDCLASS( "Wnd ")时.它的返回值就是AFX_Wnd_42_STA TIC_SUFFIX_UNICODE_SUFFIX _DEBUG_SUFFIX对于“\”仅仅是换行,也就是把两行数据连接起来框架窗口框架窗口的作用有二:一是为视图提供可视的边框,二是响应标准的窗口信息框架窗口可以分为两类:应用程序主窗口和文档窗口。
单文档程序中,主窗口就是文档窗口。
主窗口是从CFrameWnd派生的。
afx_msgAfx前缀是微软MFC一个小组的名称简写,并没有别的意义,Afx_msg消息声明:如下在头文件(DrawView.h)中声明消息响应函数原型。
//{{AFX_MSG(CDrawView) //注释宏afx_msg void OnLButtonDown(UINT nFlags, CPoint point);//}}AFX_MSG //注释宏说明:在注释宏之间的声明在VC中灰色显示。
mfc 程序框架
mfc 程序框架
MFC(Microsoft Foundation Class Library)是微软提供的一个C++框架,主要用于开发Windows桌面应用程序。
以下是MFC程序的基本框架:
1. 应用程序启动过程:
应用程序的启动从main()函数开始,main()函数通过CWinApp类创建一
个应用程序对象,然后调用该对象的Run()函数进入消息循环。
2. 文档/视图结构:
MFC程序通常采用文档/视图结构,这种结构将应用程序的数据(文档)和数据的显示与修改(视图)分开。
在MFC中,框架对象、文档对象和视图
对象是通过一个单文档模板指针有机地组织在一起,并利用AddDocTemplate函数把这个单文档模板添加到文档模板中,从而把这三
个类组织成为一个整体。
3. 对话框和控件:
MFC程序可以使用对话框和控件来与用户交互。
对话框可以通过类向导创建,控件可以通过类向导添加到对话框中。
4. 事件处理:
MFC程序通过事件处理来响应用户的操作。
事件处理函数通常在类向导中
创建,并在函数中添加处理代码。
5. 资源管理:
MFC程序使用资源管理器来管理界面资源,包括对话框、控件等。
资源管
理器负责加载和卸载资源。
6. 数据库操作:
MFC程序可以通过MFC提供的数据库类来进行数据库操作,如CRowset 类、CRecordset类等。
7. 网络编程:
MFC程序也可以进行网络编程,通过MFC提供的网络类如CSocket类等。
以上是MFC程序的基本框架,具体实现会根据具体需求有所不同。
MFC 编程基础 2 文档_视图
第2章文档/视图结构应用程序1. 文档/视图结构的思想是将数据的管理与显示分离,其中文档用于管理应用程序的数据,而视图是用户界面,用于显示、打印文档中的数据,并管理与用户的交互。
2. SDI(单文档界面) 应用程序具有文档/视图结构的程序框架,该框架包括应用程序类、窗口框架类、文档类和视图类,编程的任务是在文档类和视图类中添加适当的代码。
其中文档类中一个重要的成员函数是OnNewDocument(),用户在此添加代码完成对数据的初始化;而视图类中最重要的成员函数是OnDraw(),通过在该函数中添加代码实现窗口内容的输出。
3. 通过介绍几种SDI结构的典型应用程序来了解其结构及设计方法,典型应用包括:•利用画笔、画刷等工具及位图处理的方法实现文字和图形的输出。
•利用定时器控件制作动画程序。
•对鼠标和键盘进行编程的基本方法。
•文件、字体、颜色等几种通用对话框的使用方法及自定义对话框的设计、调用方法。
•菜单的设计方法。
2.1 文档/视图结构SDI 应用程序由AppWizard(应用向导)创建好后,即使没有编写一行代码,仍然可以运行,并且具有一个标准Windows应用程序所需要的组成成份,程序员的工作就是往这个框架添加必要的代码。
以下通过一个简单实例说明文档/视图结构应用程序的创建过程。
【例2.1】创建一个如图所示的应用程序,在窗口中显示一个矩形框,框中显示“同舟共济自强不息”。
框架窗口的视图假定本例的工程名为TEST ,程序创建过程如下:(1)利用AppWizard 创建一个SDI 应用程序框架。
(2)文档类是存放数据的主要地方,本例在其中说明一个存放矩形框数据的CRect 类对象r 和一个存放字符串的CString 对象s ,方法为:在工作区的“ClassView ”中,双击文档类CTESTDoc 类,在该类代码中添加如下代码:public:CRect r;CString s;说明:CRect 是MFC 定义的一个类,有4 个数据成员:left 、top 、right 和bottom 。
MFC基础知识概述
MFC基础知识概述MFC(Microsoft Foundation Classes)是微软公司开发的基于C++的类库,用于Windows操作系统下的图形用户界面(GUI)应用程序开发。
MFC是Windows的主要开发框架,提供了一系列的类和函数,可以用于创建窗口、控件、对话框、菜单等。
本文将对MFC的基础知识进行概述,包括MFC的结构、类层次结构、消息和事件处理、资源管理等内容。
一、MFC的结构MFC的结构主要由四个层次构成:应用程序对象、窗口对象、视图对象和文档对象。
应用程序对象继承自CWinApp类,用于创建和初始化应用程序的整个过程。
窗口对象继承自CWnd类,用于创建和管理窗口。
视图对象继承自CView类,用于显示和处理用户界面上的一部分,通常与窗口对象对应。
文档对象继承自CDocument类,用于管理应用程序中的数据。
二、MFC的类层次结构MFC提供了众多的类和函数,可以用于创建各种窗口、控件、对话框等。
类层次结构是指这些类的继承关系。
MFC的类层次结构非常庞大,以CObject类为基类,派生出众多的中间类,再由这些中间类派生出更具体的类。
例如,CObject派生出CWnd,CWnd派生出CFrameWnd,CFrameWnd派生出CView,CView派生出CScrollView和CFormView等。
通过这种类层次结构,可以方便地创建和管理各种类型的窗口和控件。
三、消息和事件处理在MFC中,消息是用于实现窗口和控件之间通信的机制。
当用户操作窗口或控件时,会产生消息,应用程序可以通过消息处理函数来处理这些消息。
MFC提供了一些宏,如DECLARE_MESSAGE_MAP和BEGIN_MESSAGE_MAP,可以简化消息处理函数的定义和注册。
消息处理函数需要通过ON_MESSAGE或ON_COMMAND宏来注册,以告诉MFC在何时何地调用该函数。
事件是消息的一个特殊形式,一般是指用户操作控件时触发的消息。
第2讲MFC应用程序框架及文档视图架构
The MFC Class Hierarchy
CObject-Derived Classes Classes Not Derived from Cobject Global Afx Functions Application Architecture Classes User-Interface Classes General-Purpose Classes ActiveX Classes Database Classes Internet Classes
文档视图架构的思想
数据嵌入文档中,利用文档的架构管理 文档与视图通信,使数据在视图中显示 视图显示数据,并与用户交互 视图放入窗口中 文档模板类对象管理上述对象协调工作 查看程序代码
文档视图架构中主要类
The CDocument Class The CView Class The CMainFrame Class The Document Template Class
CFrameWnd---WndProc
创建窗口对象时调用了Create函数,用于创 建窗口并与CFrameWnd的对象相关联,做初 始化,注册等工作。 OnCreate函数在窗口创建之后,显示之前被 调用。在CMainFrame中改写这个函数用于初 始化你自己的窗口特征。
文档视图架构
文档视图架构是MFC应用程序框架的核心 是MFC之所以成为应用程序框架的关键 它将管理数据的程序代码与与显示数据的程序 代码分开 架构中利用虚函数构建了数据处理与显示的框 架(对象之间的消息传递) 程序员只需在派生类中改写它们,完成特定的 数据处理与显示
return TRUE;
} //之后调用Run,进入消息循环。
MFC文档视图结构
MFC文档视图结构MFC(Microsoft Foundation Classes)是微软公司开发的一个用于Windows平台的C++类库,用于简化Windows桌面应用程序的开发。
MFC提供了各种类和函数,用于实现常见的视图结构,其中包括文档视图结构。
文档视图结构是MFC中用于实现文档和视图之间交互的一种架构。
它主要由文档类(CDocument)、视图类(CView)和框架窗口类(CFrameWnd)组成。
文档类(CDocument)是表示应用程序中特定文档的类,它负责管理文档的数据和状态。
每个文档类通常只处理一个特定类型的文档,如文本文档、图像文档等。
文档类中的成员函数包括OpenDocument、SaveDocument等,用于打开和保存文档。
文档类还可以包含数据成员,用于存储文档的内容。
视图类(CView)是用户界面的一部分,用于显示和修改文档的内容。
每个文档类通常都有一个对应的视图类。
视图类中的成员函数包括OnDraw、OnUpdate等,用于绘制文档的内容和响应用户输入。
视图类还可以处理鼠标、键盘等事件。
框架窗口类(CFrameWnd)是应用程序的主窗口,负责创建和管理文档和视图。
每个应用程序通常只有一个框架窗口类。
框架窗口类中的成员函数包括OnCreate、OnSize等,用于处理窗口的创建、大小调整等事件。
框架窗口类还可以包含菜单、工具栏等用户界面元素。
文档视图结构的工作流程通常如下:1.应用程序启动时,框架窗口类创建,并创建一个文档类和一个视图类。
2.框架窗口类创建菜单、工具栏等用户界面元素,同时将文档和视图关联起来。
3.用户可以通过菜单、工具栏等用户界面元素打开、保存文档,触发相应的文档类成员函数。
4.文档类根据用户的操作,读取或写入文件的数据,更新文档的内容。
5. 视图类接收到文档类的数据变化通知(通过OnUpdate函数),根据最新的数据,重新绘制文档的内容。
6.用户可以通过鼠标、键盘等与视图进行交互,触发相应的视图类成员函数。
VS2021之MFC入门到精通教程(1-55全数)
三.安装MSDN
咱们利用VS2021进行软件开发一样离不开帮忙文档,即MSDN。在本地安装MSDN的方式如下:
在开始菜单的“所有程序”->“Microsoft Visual Studio 2021”->“Visual Studio Tools”下选择“Manage Help Settings - ENU”:
点“Update”进行安装,等待其完成绩可以了。
利用MSDN时点击开始菜单的“所有程序”->“Microsoft Visual Studio 2021”->“ocumentation”即可。
到此VS2021和MSDN的安装进程就结束了。以后就可以够正式利用VS2021进行软件开发了。至于在鸡啄米的C++编程入门系列中已经介绍过,大家可以看看。
鸡啄米这里简略演示下如何生成单文档应用程序框架,让大家先有个直观的了解,有不睬解的地方可以留着以后回来再看。下面依照操作步骤一步步讲解:
1.点菜单栏File->New->Project,弹出New Project对话框,咱们可以选择工程类型。
若是安装完VS2021以后第一启动时已经设置为VC++,则Installed Templates->Visual C++项会默许展开,而如果没有设置VC++,则可以展开到Installed Templates->Other Languages->Visual C++项。因为咱们要生成的是MFC程序,所以在“Visual C++”下选择“MFC”,对话框中间区域会出现三个选项:MFC ActiveX Control、MFC Application和MFC DLL。MFC ActiveX Control用来生成MFC ActiveX控件程序。MFC Application用来生成MFC应用程序。MFC DLL用来生成MFC动态链接库程序。固然我们要选择MFC Application。
第6章--MFC教程
第6章--MFC教程第6章文档及视图内容:文档、视图、框架、应用四个类的相互作用函数如何添加window消息、菜单消息和鼠标消息捕获消息,限制鼠标的范围,定制鼠标形状,菜单(动态改变菜单)滚动操作、各种坐标第6章文档及视图§6.1文档与视图的关系一、文档/视图结构概述在典型的MFC应用中,文档和视图是成对出现的。
文档/视图的核心部分包括以下四个关键的类。
CDocument类:为文档类提供了基本的功能,用于存储或控制程序中的数据。
CView类:为视图类提供了基本的功能。
视图通常依附于文档,它是文档和用户之间的协调者。
CFrameWnd类:提供了文档中视图的框架窗口。
CDocTemplat或CSingleDocTemplate和CMultiDocTemplate类:协调一个或多个给定类型的文档,并负责创建正确的文档、视图和框架窗口对象。
二、文档模板和文档/视图⑥Window跟踪所有打开的窗口,以便给它们发送消息。
一般情况下,一个框架窗口中只包含一个视图,但在切分窗口中,同样的框架窗口可以包含多个视图指向主框架窗口的指针存储在应用对象的m_pMainWnd成员变量中。
通过一个文档模板来创建的。
框架应用使用了两个文档模板类:用于SDI应用的CSingleDocTemplate类和用于MDI应用的CMultiDocTemplate类。
CSingleDocTemplate模板类一次可以创建和存储一个特定类型的文档;CMultiDocTemplate模板类则可以保存多个已打开的特定类型的文档。
文档模板是由应用对象来创建和维护的。
在应用中的InitIntance函数的关键任务就是创建一个或多个适当的文档模板。
应用对象提供了增加文档模板的接口,系统调用AddDocTemplate函数即可增加文档模板。
当利用File菜单中的New或Open命令创建一个新的文档时,文档模板同时也创建了一个新的框架窗口来查看该文档。
第2章 MFC应用程序概述
是否支持 文档/视图 结构
语言种类
多文档界面(MDI)应用 程序。应用程序可以同 时打开多个文档。
基于对话框的应用程序。 应用程序将显示一个简 单的对话框来处理用户 的输入,
2020/6/17 Visual C++程序设计与应用教程
第2章 MFC应用程序概述
13
(3)MFC AppWizard-Step 2 of 6对话框中主要用于选择
2020/6/17 Visual C++程序设计与应用教程
第2章 MFC应用程序概述
5
2.1.3 基本数据类型 Windows编程中常用的基本数据类型的别名。
2020/6/17 Visual C++程序设计与应用教程
第2章 MFC应用程序概述
6
2020/6/17 Visual C++程序设计与应用教程
命令类CCmdTarget是CObject的子类,它是MFC 库中所有具有消息映射属性的类的公共基类。从 CCmdTarget派生的类能在程序运行时动态创建对象 和处理命令消息。
2020/6/17 Visual C++程序设计与应用教程
第2章 MFC应用程序概述
22
3.CWinApp类 应用程序类CWinApp是CWinThread的子类,封
第2章 MFC应用程序概述
8
2020/6/17 Visual C++程序设计与应用教程
第2章 MFC应用程序概述
9
由于对应的MFC 类已对句柄进行 了封装,大多数 情况下不再需要
访问句柄。
2020/6/17 Visual C++程序设计与应用教程
MFC编程基础教程
第1章基于对话框的Windows应用程序1.简介Windows编程的两种方法,即Windows API编程和MFC编程。
2.基于对话框的应用程序的创建过程:?? 建立基于对话框的MFC 应用程序框架;?? 放置控件;?? 设置控件属性;?? 为控件连接变量,即为控件命名;?? 添加并且编写消息处理函数。
3.??????????????????1.1???用(1.1.1从本质上来说,API 是Windows 系统支持的函数定义、参数定义和消息格式的集合,共有上千个标准的API 函数可供应用程序调用。
调用Windows API 函数的方法与调用C 语言库函数的方法基本相同。
下面通过一个简单的实例来说明Windows API 编程是如何调用API 函数的。
…………………………………………………………# include "windows.h"int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow){MessageBox ( NULL," 这是一个简单的Windows 应用程序!","API 函数调用示例",MB_OK );return 0;}…………………………………………………………这是一个简单的Windows 应用程序。
Windows 应用程序的主函数是WinMain() ,不是main() 函数。
函数体中调用了Windows API 函数MessageBox() ,弹出如图所示的对话框。
在直接使用API 函数进行Windows 编程时,程序员不仅需要熟记一大堆常用的API 函数,而且还要对Windows 操作系统有深入的了解,编写大量的代码。
用这种方式即使是开发一个很简单的应用程序也需要大量的工作,直接用API 函数进行编程是需要极大的耐心和丰富的编程经验的。
MFC应用程序设计基础v2
MFC的组织是以C++类的层次形式组织在一起,几个高 层类提供一般功能,而低层类实现更具体的功能,每一个 低层类都是从高层类派生而来,因此继承了高层类的功能。
*1.5 使用C++和MFC的好处
从本书的第一篇,我们已经看出了面向对象程序设计的好 处,如可复用性、代码和数据紧密地绑定等。类是面向对象程序 设计的核心概念,程序中不仅可以使用自己建立的类,还可以使 用系统所提供的类,一个好的类库可以大大减少编码的数量。 MFC成功之处在于,它是一个类库、一个包罗计算机系统方方面 面的类库、一个集MicroSoft各路软件高手之大成的类库。通过 从MFC继承自己所需要的类,可以充分利用基类所具有的各种功 能。
MFC采用面向对象的设计方法,将Windows API中的相关 部分组合到C++类或对象中。例如CWnd类封装了大部分有关 窗口处理的API 函数。作为编程人员,不必记忆大量API 函数, 需要作的只是实例化CWnd类的一个实例,并调用相应的成员 函数即可。
1.3 MFC的目标
建立MFC库的目的是为了简化Windows应用程序的 编制,MFC开发小组的工作是将此目的和程序设计原理 结合起来。Microsoft在建立MFC库遵循了一些基本原则, 也是他们的设计目标:
MFC处理很多与Windows相关的常见任务,例如在后 台做消息处理以及对消息进行路由选择,无需程序员在每一 个开发的Windows应用程序中编写相同的消息处理循环, MFC已经实现了这一消息循环,并对大多数常见的消息提供 了易学易用的消息响应函数。例如OnPain()就是CWnd类的 一个成员函数,是对WM_PAINT消息进行响应的一个虚成员 函数。
第2讲MFC程序设计基础(new)
2.2.1 MFC与消息处理
1、在MFC程序中,API程序的WinMain() 和 消息循环被封装到MFC类库中,不需要用户进行 干预。我们在MFC程序中看不到这些相应的代码了。 2、窗口函数也看不到了,窗口由窗口对象来管理, 消息由该窗口对象的成员函数处理。 3、在MFC编程中,最主要的任务是编写消息处理 函数。
C++
类
ቤተ መጻሕፍቲ ባይዱ
注意:MFC并未对所有的API都进行了封装。
MFC定义了 1)C++类库 2)一套完整的WINDOWS应用程序模型。 该模型的作用有二: 1、定义MFC类间的关系。 2、定义标准的程序结构。
2.1.1 MFC与应用程序框架
应用程序框架:MFC定义的这个标准的程序结构 及与此相关的程序代码被称为应用程序框架。也 叫框架程序(不需要用户编写代码也可以运行)①。
3、派生窗口类
CWnd::OnPain成员函数负责处理发给窗口的WM_PAINT消 息,可以实现窗口绘制,因此需要对CWnd派生子类,并重 载(重写)OnPaint成员函数。
在MFC中,CWnd的一些派生类对CWnd实现了更高的封装, 不仅添加了功能,而且使用更方便,如CFrameWnd。本例 的窗口类为了使用更方便就是从CFrameWnd进行派生的。
另外,MFC程序中需要使用 DECLARE_MESSAGE_MAP()宏为类添加消息处理能力。
4、建立窗口 在窗口类的构造函数中使用从父类继承来的 Create成员函数来建立窗口。该函数的参数 说明见书P24。 在重载的InitInstance成员函数中添加建立程 序窗口的代码,程序在初始化时完成窗口的 建立(new 一个窗口类,创建窗口类对象的 同时,构造函数创建窗口)和显示(调用 ShowWindow和UpdateWindow)。代码见 书P24。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第2章文档/视图结构应用程序1. 文档/视图结构的思想是将数据的管理与显示分离,其中文档用于管理应用程序的数据,而视图是用户界面,用于显示、打印文档中的数据,并管理与用户的交互。
2. SDI(单文档界面) 应用程序具有文档/视图结构的程序框架,该框架包括应用程序类、窗口框架类、文档类和视图类,编程的任务是在文档类和视图类中添加适当的代码。
其中文档类中一个重要的成员函数是OnNewDocument(),用户在此添加代码完成对数据的初始化;而视图类中最重要的成员函数是OnDraw(),通过在该函数中添加代码实现窗口内容的输出。
3. 通过介绍几种SDI结构的典型应用程序来了解其结构及设计方法,典型应用包括:•利用画笔、画刷等工具及位图处理的方法实现文字和图形的输出。
•利用定时器控件制作动画程序。
•对鼠标和键盘进行编程的基本方法。
•文件、字体、颜色等几种通用对话框的使用方法及自定义对话框的设计、调用方法。
•菜单的设计方法。
2.1 文档/视图结构SDI 应用程序由AppWizard(应用向导)创建好后,即使没有编写一行代码,仍然可以运行,并且具有一个标准Windows应用程序所需要的组成成份,程序员的工作就是往这个框架添加必要的代码。
以下通过一个简单实例说明文档/视图结构应用程序的创建过程。
【例2.1】创建一个如图所示的应用程序,在窗口中显示一个矩形框,框中显示“同舟共济自强不息”。
框架窗口的视图假定本例的工程名为TEST ,程序创建过程如下:(1)利用AppWizard 创建一个SDI 应用程序框架。
(2)文档类是存放数据的主要地方,本例在其中说明一个存放矩形框数据的CRect 类对象r 和一个存放字符串的CString 对象s ,方法为:在工作区的“ClassView ”中,双击文档类CTESTDoc 类,在该类代码中添加如下代码:public:CRect r;CString s;说明:CRect 是MFC 定义的一个类,有4 个数据成员:left 、top 、right 和bottom 。
(left, top) 和(right, bottom )分别表示一个矩形左上角坐标和右下角坐标,单位是像素(点)。
窗口中央客户区中坐标系原点(0,0)在左上角,轴正方向朝下。
(3)在文档类的成员函数OnNewDocument() 中完成数据成员的初始化。
方法为:在工作区的ClassView 中展开CTESTDoc 类,找到其成员函数OnNewDocument() ,在其中添加代码:BOOL CTESTDoc::OnNewDocument(){ if (!Cdocument::OnNewDocument())return FALSE;// TODO: add reinitialization code here// (SDI documents will reuse this document)r=CRect(100,60,260,100);s=”同舟共济自强不息”;return TRUE;} 说明:阴影部分为添加的代码。
(4)在工作区的“Class View ”中展开视图类CTESTView 类,找到其成员函数OnDraw() ,添加输出矩形框和文字的代码:void CTESTView::OnDraw(CDC* pDC){ CTESTDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data herepDC->Rectangle(pDoc->r); //用文档中的数据r画矩形框pDC->TextOut(110,70,pDoc->s); // 输出函数用法见2.2 节}说明:①GetDocument() 是视图类的一个重要成员函数,其返回值是指向当前文档的指针。
视图类中的成员函数通过它访问文档类的公有数据成员。
②函数OnDraw() 是实现输出的关键函数,绝大多数的显示工作都是在这个函数中完成的。
其参数pDC 指向窗口中央的客户区(视图)对应的输出设备,程序使用该输出设备对象的Rectangle 和TextOut 函数绘制矩形和输出文字。
CDC是设备上下文类,输出设备是CDC类的对象。
( 5 ) 运行程序,结果如图所示。
SDI 应用程序框架1.应用程序类每个应用程序类必须从CWinApp 派生出自己的应用程序类,该类封装了包括初始化、运行和结束的整个过程,其名称是AppWizard 根据工程名称自动命名的,规则如下:(1)如果工程名符合标识符的命名规则,则应用程序类名由字母C 、工程名和App 三部分组成。
例如,工程名为TEST ,则应用程序类名为CTESTApp 。
(2)如果工程名以数字开始,则应用程序类名由字母Cmy 、工程名和App 三部分组成。
例如,工程名为1TEST ,则应用程序类名为CMy1TESTApp 。
(3)忽略工程名的汉字。
文档类和视图类的命名规则与应用程序类类似,区别在于在后面分别添加了Doc 和View 。
2.窗口框架类从CMainWnd 派生,提供了一个SDI 窗口的所有功能,如显示一个标题、一个菜单栏、一个工具栏等。
所有SDI 应用程序窗口框架类都是CMainFrame。
3.文档类从CDocument 类派生出来,是应用程序进行数据定义和初始化的地方。
文档类的数据成员只有被说明成公有成员才能被视图类中的成员函数访问,其重要成员函数是OnNewDocument() ,是进行数据成员初始化的地方。
程序开始时会自动调用该函数。
4.视图类从CView 中派生出来,是程序的用户界面,用于显示、打印存储在文档类对象中的数据,并管理与用户的交互。
重要成员函数有:(1)GetDocument() 函数该函数的返回值是指向与当前视图相关联的文档对象的指针,因而通过它可以访问文档类对象中的公有私有成员。
其一般使用形式为:CTESTDoc* pDoc = GetDocument();说明:①在不同的应用程序中,pDoc 所指向的文档类对象的名称是不一样的。
若工程名称为TEST ,则文档类的名称为CTESTDoc ,若工程名为ABC ,则文档类名为CABCDoc ,则应用CABCDoc* pDoc 定义。
②在OnDraw函数中,这个语句是自动生成的。
在用户自定义的视图类成员函数中,如果需要访问文档类对象的公有数据成员,则应添加这样的语句。
(2)OnDraw() 函数在视图类中,OnDraw() 是一个很重要的成员函数,用于实现输出。
一般来说,窗口中的内容都是OnDraw() 输出的。
初始的OnDraw()函数如下:void CTESTView::OnDraw(CDC* pDC){ CTESTDoc* pDoc = GetDocument(); // 获得指向文档类对象的指针ASSERT_VALID(pDoc); // 检查pDoc 是否有效,若无效结束程序// TODO: add draw code for native data here}说明:OnDraw()函数有两种调方法:①自动调用:当窗口发生变化视图需要重新绘制时,应用程序会自动调用该函数。
②手工调用:当程序中的数据改变了需要重新显示时,可以通过调用视图类成员函数Invalidate() 和InvalidateRect() 函数,引发对Ondraw() 的调用。
需要注意的是,不是直接调用Ondraw()函数。
原型:void Invalidate( BOOL bErase = TRUE ) // 参数bErase 默认值为TRUEInvalidate(TRUE) // 擦除窗口原有的内容,重新绘制。
Invalidate(FALSE) // 窗口原有的内容保留,再进行绘制。
InvalidateRect( 矩形, TRUE) // 擦除矩形区域内原有内容,重新绘制这个区域。
InvalidateRect( 矩形, FALSE) // 矩形区域内原有内容保留,再绘制这个区域。
2.2 文字和图形的输出窗口中央的客户区是一个输出文字和图形的区域。
客户区(视图)对应的输出设备是设备上下文类CDC的对象,在客户区输出信息主要用到CDC类的成员函数。
简单的文字和图形输出文字输出形式:virtual BOOL TextOut(int x, int y, LPCTSTR lpszString, int nCount);说明:从坐标(x,y) 开始显示lpszString 字符串,其中参数nCount 指定字符串中的字节数。
另一种重载形式为BOOL TextOut( int x, int y, const CString& str );画点形式:COLORREF SetPixel(int x, int y, COLORREF crColor);COLORREF SetPixel(POINT point, COLORREF crColor);说明:①POINT 是MFC 定义的结构类型,表示平面上的一个点。
它的两个重要元素是x 和y ,分别表示一个点的x 坐标值和y 坐标值。
与POINT 类似的是CPoint 类,两个数据成员也是x 和y 。
②COLORREF 是一个32 位整数类型,用于表示颜色,其第0 、1 、2 字节分别存放了一种颜色的红、绿、蓝的值。
用三种颜色合成一种颜色的函数是RGB ,例如:COLORREF C1=RGB(0, 0, 0) ;// 合成黑色COLORREF C2=RGB(255, 255, 255); // 合成白色COLORREF C3=RGB(255, 0, 0); // 合成红色COLORREF C4=RGB(0, 255, 0); // 合成绿色COLORREF C5=RGB(0, 0,255); // 合成蓝色COLORREF C6=RGB(255, 255, 0); // 合成亮黄色COLORREF C7=RGB(0,255, 255); // 合成青色COLORREF C8=RGB(255, 0, 255); // 合成品红色COLORREF C9=RGB(0, 0,128); // 合成深蓝色COLORREF C10=RGB(0, 128, 0); // 合成深绿色COLORREF C11=RGB(128, 128, 128); // 合成深灰色COLORREF C12=RGB(128, 128, 128); // 合成浅灰色③使用指定颜色crColor 在坐标(x,y) 或点point 处画一个点,返回用于画点的颜色。
画线画线需要调用两个函数:首先调用MoveTo 函数确定线段的起点,然是调用LineTo 确定线段的终点。