MFC 编程基础 2 文档_视图结构应用程序
- 格式:doc
- 大小:377.50 KB
- 文档页数:25
实验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 教程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编程。
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++语言在语法和设计思想上应该有了一定的了解了。
文档与视图的关系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(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程序的基本框架,具体实现会根据具体需求有所不同。
第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 确定线段的终点。