windows编程 12文档与视图
第12讲 单文档与多文档
四 SDI编程实例
【例11-1】在主窗 口中央显示一文 本“您好, 单文档 界面的例程!”。单 击“改变显示文 本”菜单项,可 弹出一个对话框, 通过此对话框可 改变主窗口中的 显示文本内容
MDI 程序
MDI程序有多个子视图。因此,对应多个文档。 MDI程序中框架窗口、文档和视图的创建是在应用程序对象 的InitInstance()成员函数中通过文档模板类完成的: 下面程序:创建多文档模板 CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate( IDR_MYMDITYPE, RUNTIME_CLASS(CMyDoc), // 文档类 RUNTIME_CLASS(CChildFrame), // 框架窗口类 RUNTIME_CLASS(CMyView)); // 视图类 …… 如果是多种文档,可定义多个文档模板( pDocTemplate )
二、Doc/View框架的主要成员
MFC的Doc/View框架的核心类只有五个: CWinApp: 应用类(主程序) CView:视图基类 CDocument:文档基类 CDocTemplate:文档模板类 CFrameWnd:框架窗口类
1 CWinApp 类
CWinApp类代表主程序,CWinApp本身是不可见的, 它负责维护进程的启动、终止、消息循环、命令行参数、 资源管理 成员 InitInstance ExitInstance 描述 初始化实例 结束实例
用以存放字符串
(3) 初始化文档类成员变量
在T11-1Doc.cpp文件中,选择 OnNewDocument成员函 数加入以下代码: BOOL CT111Doc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; m_str=L"您好,单文档界面的例程!"; //初始化成员变量 return TRUE; }
MFC原理结构说明
MFC原理结构说明MFC(Microsoft Foundation Classes)是一种在Windows平台上开发图形用户界面(GUI)的框架。
MFC提供了一组类、函数和宏,用于简化Windows应用程序开发过程。
本文将对MFC的原理和结构进行详细说明。
一、MFC的原理1. 类与对象:MFC使用面向对象的编程模型,所有的窗口、控件、消息处理程序等都是通过类来定义和创建的。
每个MFC应用程序都包含一个CWinApp类的对象,这个对象是整个应用程序的入口点。
2. 消息映射机制:在MFC中,消息是Windows事件的一种表示。
MFC使用消息映射机制来处理这些消息。
消息映射机制是程序员在类中定义的一种技术,它将特定消息与对应的消息处理函数关联起来。
当收到消息时,MFC会自动调用相应的消息处理函数进行处理。
3. 消息与事件:在MFC中,消息是Windows事件的抽象表示,而事件是用户界面中的交互行为。
MFC提供了一系列预定义的消息类型,如鼠标点击、按键、窗口关闭等,程序员只需要在类中覆盖对应的消息处理函数,就可以处理这些消息。
4. 窗口类和控件类:在MFC中,窗口类和控件类是界面元素的基础。
MFC提供了一组窗口类(如CWnd、CFrameWnd)和控件类(如CButton、CEdit),程序员可以通过继承这些类来创建自定义的窗口和控件。
5. 文档视图模型:MFC中引入了文档视图模型(Document-View Model)的概念,用于实现应用程序的数据和界面的分离。
文档类(CDocument)管理应用程序的数据,视图类(CView)用于显示数据,而框架窗口类(CFrameWnd)则用于协调文档和视图之间的交互。
二、MFC的结构1. 应用程序类(CWinApp):应用程序类是MFC应用程序的入口点,它派生自CWinApp类。
应用程序类负责初始化应用程序的环境,包括注册窗口类、创建主窗口、加载并运行消息循环等。
vs2008mfc教程
VS2008 MFC教程什么是MFC?MFC(Microsoft Foundation Classes)是一组用于Windows开发的C++类库。
它是一种基于对象的编程框架,旨在简化Windows图形用户界面(GUI)应用程序的开发。
MFC提供了许多预定义的类和函数,可用于创建窗口、对话框、菜单、工具栏等常见界面元素。
使用MFC可以大大加快GUI应用程序的开发速度,并提供Windows应用程序的一致外观和行为。
VS2008中的MFCMFC应用程序在Visual Studio 2008中创建一个MFC应用程序非常简单。
可以选择使用MFC应用程序向导,该向导将引导您完成创建应用程序的过程。
在创建应用程序时,您可以选择使用对话框或单文档/多文档界面。
MFC文件结构一个MFC应用程序通常包含多个文件。
以下是一些主要文件和文件夹:•AppName.cpp:包含应用程序的主要函数WinMain。
•AppName.h:包含应用程序的头文件,声明了应用程序类的成员变量和函数。
•AppNameDoc.cpp、AppNameDoc.h:包含应用程序的文档类,并实现了文档的读写功能。
•AppNameView.cpp、AppNameView.h:包含应用程序的视图类,用于处理用户界面和绘图。
•AppNameDlg.cpp、AppNameDlg.h:如果应用程序使用了对话框界面,则会包含对话框类的文件。
MFC消息映射在MFC中,用户界面中的各种事件(如按钮点击、菜单选择等)被称为消息。
消息映射允许您将特定消息与特定函数关联起来。
例如,当用户点击一个按钮时,MFC将自动调用与该按钮关联的函数,从而实现与按钮相关的操作。
MFC使用宏定义来实现消息映射。
您可以通过在类的消息映射表中添加条目来指定消息和对应的函数。
例如:BEGIN_MESSAGE_MAP(CMyView, CView)ON_COMMAND(ID_FILE_OPEN, &CMyView::OnOpenFile) ON_COMMAND(ID_FILE_SAVE, &CMyView::OnSaveFile) END_MESSAGE_MAP()上述代码将ID_FILE_OPEN和ID_FILE_SAVE消息与CMyView类中的OnOpenFile和OnSaveFile函数相关联。
MFC多文档多视图编程
深入了解MFC中的文挡/视结构李泽宇金刚熊联欢姜军(华中理工大学图象识别与人工智能研究所)Visual C++ 5.0 以其功能强大、用户界面友好而倍受程序员们的青睐。
但是,在当前的Microsoft 基本类库4.2 版本中,大约有将近200 个类,数千个函数,加之Microsoft 公司隐藏了一些技术细节,使得人们深入学习MFC变得十分困难。
MFC的AppWizard可以生成三种类型的应用程序:基于对话框的应用、单文档应用(SDI)和多文档应用(MDI)。
前两者的结构较简单,本文不再赘叙。
笔者拟从MFC中的文档/视结构入手,分析一些函数的流程,并解决编制MDI 应用程序过程中的一些常见问题。
(一)、了解文档/视结构MFC应用程序模型历经多年以有了相当大的发展。
有一个时期,它只是个使用应用程序对象和主窗口对象的简单模型。
在这个模型中,应用程序的数据作为成员变量保持在框架窗口类中,在框架窗口的客户区中,该数据被提交显示器。
随着MFC2。
0的问世,一种应用程序结构的新方式----MFC文档/视结构出现了。
在这种结构中,CFrameWnd繁重的任务被委派给几个不同类,实现了数据存储和显示的分离。
一般情况下,采用文档/视结构的应用程序至少应由以下对象组成:。
应用程序是一个CwinApp派生对象,它充当全部应用程序的容器。
应用程序沿消息映射网络分配消息给它的所有子程序。
框架窗口是一CfrmeWnd派生对象。
文档是一个CDocument派生对象,它存储应用程序的数据,并把这些信息提供给应用程序的其余部分。
视窗是Cview派生对象,它与其父框架窗口用户区对齐。
视窗接受用户对应用程序的输入并显示相关联的文档数据。
通常,应用程序数据存在于简单模型中的框架窗口中。
在文档/视方式中,该数据移入称为document 的独立数据对象。
当然,文档不一定是文字,文档是可以表现应用程序使用的数据集的抽象术语。
而用户输入处理及图形输出功能从框架窗口转向视图。
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();
mfcwindows程序设计
mfcwindows程序设计全文共四篇示例,供读者参考第一篇示例:MFC(Microsoft Foundation Class)是微软公司提供的基于Windows操作系统的C++类库,用于开发Windows应用程序。
MFC 为开发者提供了丰富的类和函数,简化了Windows应用程序的开发过程,使开发者能够快速地创建功能强大的Windows桌面应用程序。
MFC的设计目标是提供一种易于使用的框架,使开发者能够专注于应用程序的逻辑功能而不必过多关心底层的Windows API。
MFC提供了一些基本的类,如CWinApp、CWinFrameWnd、CDialog等,开发者可以继承这些类并重载其成员函数来实现自己的逻辑。
MFC的开发流程通常是这样的:首先创建一个MFC应用程序工程,然后在工程中添加需要的资源和类文件,并通过类向导生成相应的类,最后编写具体的逻辑代码。
MFC应用程序通常包括菜单、工具栏、对话框、工具栏等界面元素,开发者可以通过拖拽控件来设计界面,通过消息映射机制来处理用户操作。
MFC的优点之一是它与Visual Studio集成得很好,可以通过IDE 直观地进行开发、调试和部署。
开发者可以使用可视化编辑器来设计界面,利用自动生成的代码框架来实现业务逻辑,以及通过调试工具来调试程序。
MFC还提供了强大的文档视图架构,使得开发者可以轻松地实现文档的编辑、显示和保存。
MFC还提供了许多方便的类和函数,如文件操作类CFile、字符串处理类CString、图形绘制类CDC等,这些类和函数大大简化了开发者的工作,提高了开发效率。
MFC还提供了许多常用控件和常用对话框,如按钮、编辑框、列表框、进度条,以及文件对话框、颜色对话框、字体对话框等,使开发者可以快速地实现各种功能。
MFC也有其局限性。
随着技术的不断发展,MFC的功能和性能已经逐渐落后于现代的开发框架,如WPF、WinRT等。
MFC的界面设计相对较为传统,不够现代化,而且在跨平台开发上也存在问题。
windows的运行机制
视图类:负责数据
的显示与打印 单文档应用程序WinGreet中使用到的类
MFC程序的启动
1、创建Application object对象 theApp
程序一开始生产一个(且只有一个)应用类对象 theApp,
也即一个CWinApp对象,这个全局对象一产生,便执行其 构造函数,导致其基类CWinApp类的构造函数被调用。该 函数定义于APPCORE.CPP第75行,因此,CWinApp之中的 成员变量将因为theApp这个全局对象的诞生而获得配置
}
MFC程序的运行
// process this message if (m_msgCur.message != WM_KICKIDLE &&
!PreTranslateMessage(&m_msgCur))
{ ::TranslateMessage(&m_msgCur); ::DispatchMessage(&m_msgCur); }
AfxWinInit之后的操作是pApp->InitApplication 而pApp指向CWinGreetApp对象,所以 相当于调用: CWinGreetApp::InitApplication(); 而CWinGreetApp继承自CWinApp, InitApplication
又是CWinApp的一个虚拟函数,我们并没有改写它(大
与初值
在SDK编程时,是通过一个应用程序的实例号来标示一个应用程序 的。在基于MFC应用程序中,是通过产生一个应用类的对象来唯一
标识我们的整个应用程序。
MFC程序的启动
2、WinMain登场 用SDK编程序时,程序的入口点是WinMain函数, 而在MFC程序里我们并没有看到WinMain函数, 原 来她是被隐藏在MFC代码里面了。当theApp配置完
Windows程序设计-大学模拟题(附答案)
《Windows程序设计》模拟题一,单选题1.所有的Windows应用程序都是由()驱动的.A.事件B.消息C.命令D.菜单[答案]:B2.一般应用程序不会派生自己的()类.A.主框架B.视图C.菜单D.文档[答案]:C3.MessageBox不能完成()功能.A.接收用户输入B.显示消息C.改变对话框标题D.显示问号图标[答案]:A4.Windows系统中的消息不包括().A.标准Windows消息B.控件消息C.命令消息D.视图消息[答案]:D5.()函数是从CView继承来的成员函数,用于刷新整个视图窗口屏幕.A.InvalidateB.MouseMoveC.PaintD.Brush[答案]:A6.菜单()消息,处理菜单状态的动态变化.A.UPDA TE_UIB.UPDATEMANDD.UPDA TE_COMMAND_UI[答案]:DmdUI类的常用成员函数()使菜单项前增加或清除√标志.A.SetCheckB.SetRadioC.SetTextD.Enable[答案]:A8.编辑菜单时为使字母下带下划线,应使用助记符().A.@B.#C.&D.$[答案]:CmdUI类的常用成员函数()使菜单项前增加或清除圆点标志.A.SetCheckB.SetRadioC.SetTextD.Enable[答案]:BmdUI类的常用成员函数()设置菜单项有效或无效.A.SetCheckB.SetRadioC.SetTextD.Enable[答案]:DmdUI类的常用成员函数()改变菜单项文本.A.SetCheckB.SetRadioC.SetTextD.Enable[答案]:C12.CDC的常用函数()可以绘制矩形.A.EllipseB.RectangleC.ArcD.Circle[答案]:B13.应用程序可以使用GDI创建3种类型的图形输出,不包括().A.矢量图形C.光栅图形D.文本[答案]:B14.CDC的常用函数()可以绘制内接矩形的圆.A.EllipseB.RectangleC.ArcD.Circle[答案]:A15.()函数用于在指定位置输出字符串.A.PrintB.TextOutC.ScanfD.Write[答案]:B16.在View的在普通成员函数体内用()获得设备环境.A.CDCB.CWindowDClientDClassDC[答案]:C17.创建画笔不需要给出()参数.A.风格B.宽度C.颜色D.长度[答案]:D18.实线画笔的风格应用()宏.A.PS_SOLIDB.PS_DASHC.PS_DOTD.PS_DASHDOT[答案]:A19.实心画刷只需要定义().A.填充样式B.填充颜色C.填充模式[答案]:B20.对话框()描述对话框的外观和控件布局,在资源描述文件中有对话框的定义.A.资源B.类C.模板D.数据[答案]:A21.调用对话框类的对象的方法,创建并显示模态对话框.A.Print()B.Create()C.DoModal()D.Show()[答案]:C22.CDialog中的()成员函数用于成员变量和控件之间的数据传递.A.ExchangeB.ToDoC.EXTD.UpdateData[答案]:D23.静态控件不包括().A.静态文本B.按钮C.静态图片D.组框[答案]:B24.()不是编辑框的消息.A.BN_CLICKEDB.EN_CHANGEC.EN_KILLFOCUSD.EN_SETFOCUS[答案]:A25.()设置进度条的当前位置.A.SetRangeB.SetStepC.SetPosD.StepIt[答案]:C26.()设置进度条范围.A.SetRangeB.SetStepC.SetPosD.StepIt[答案]:A27.()设置进度条填充步长.A.SetRangeB.SetStepC.SetPosD.StepIt[答案]:B28.()让进度条前进一个步长.A.SetRangeB.SetStepC.SetPosD.StepIt[答案]:D29.文档和视图的关系是().A.一对一B.一对多C.多对一D.多对多[答案]:B30.在视图类中获得文档类对象指针用函数().A.GetDocumentB.UpdateAllViewsC.OnUpdateD.SetModifiedFlag[答案]:A31.Win32应用程序入口函数是().A.MainB.EntranceC.WinMainD.Inlet[答案]:C32.创建窗口工作()不在WinMain中完成.A.设计窗口类B.注册窗口类C.创建窗口D.窗口过程[答案]:D33.项目文件的扩展名是().A.exeB.dspC.dswD.cpp[答案]:B34.利用ClassWizard不能().A.建立新类B.进行消息映射C.增加类的成员变量D.插入资源[答案]:D35.下列()不是MFC消息映射机制有关的宏.A.DECLARE_MESSAGE_MAPB.BEGIN_MESSAGE_MAPC.DECLARE_SERIALD.END_MESSAGE_MAP[答案]:C36.要使鼠标箭头在按钮上暂停时能显示工具栏按钮提示,必须设置工具栏的风格为().A.CBRS_TOOLTIPSB.CBRS_FL YBYC.CBRS_NOALIGND.WS_VISIBLE[答案]:B37.当滑块滑动时,滑块条控件将发送滚动消息来通知父窗口,水平滑动条发送()消息.A.WM_CHARB.WM_HSCROLLC.WM_VSCROLLD.WM_CHANGE[答案]:B38.要将模式对话框在屏幕上显示需要用到().A.CreateB.DoModalC.OnOKD.构造函数[答案]:B39.当滑块滑动时,滑块条控件将发送滚动消息来通知父窗口,垂直滑动条发送()消息.A.WM_CHARB.WM_HSCROLLC.WM_VSCROLLD.WM_CHANGE[答案]:C40.以下控件中,()没有Caption属性.A.按钮B.组框C.编辑框D.静态文本框[答案]:C41.关于工具栏,菜单和加速键的关系,正确的说法是().A.工具按钮与菜单必须一一对应B.工具栏与加速键一一对应C.工具按钮不必与菜单一一对应D.菜单与加速键一一对应[答案]:C42.使用GetDC()获取的设备上下文在退出时,必须调用()释放设备上下文.A.ReleaseDC()B.deleteC.DeleteDC()D.Detach()[答案]:A43.列表框CListBox类的成员函数()用来向列表框增加列表项.A.AddString()B.DeleteString()C.ResetContent()D.FindString()E.GetCount()[答案]:A44.列表框CListBox类的成员函数()用来清除列表项所有项目.A.AddString()B.DeleteString()C.ResetContent()D.FindString()E.GetCount()[答案]:C45.下面()不是MFC设备环境类CDC类的派生类.A.GDIB.CPaintDClientDCD.CWindowDC[答案]:A46.()是非模态对话框.A.查找对话框B.字体对话框C.段落对话框D.颜色对话框[答案]:A47.使用()通用对话框类可用打开文件.A.CFileDialogolorDialogC.CPrintDialogD.CFontDialog[答案]:A48.常见的菜单类型不包括().A.自动菜单B.主菜单C.弹出菜单D.快捷菜单[答案]:A49.下列()不是MFCCDC类中常用的函数.A.TextOutB.EllipseC.RectangleD.CreateRedText[答案]:D50.对话框的功能被封装在()类中.A.CWndB.CDialogC.CObjectmdTarget[答案]:B51.Windows标准控件的属性设置通常由三个选项卡构成,不包括()A.ColorB.GeneralC.StyleD.ExtendStyles[答案]:A52.菜单项助记符前用()引导.A.%B.&C.#D.$[答案]:B53.更新菜单状态的消息是().MANDB.UPDATEC.UPDATE_COMMAND_UID.INV ALIDATE[答案]:C54.能间接调用视图类的OnDraw函数的是()A.OnTimerB.LButtonDownC.SerializeD.Invalidate[答案]:D55.下列()不是MFC消息映射机制有关的宏.A.DECLARE_MESSAGE_MAPB.BEGIN_MESSAGE_MAPC.DECLARE_SERIALD.END_MESSAGE_MAP[答案]:C56.下面()不是GDI对象.A.CFontB.CPalettelientDCD.CBitmap[答案]:C57.列表框的类型不包括()A.SimpleB.DropdownC.DropListD.Scroll[答案]:D58.设置编辑框控件的文本内容,可使用函数()A.SetWindowTextB.SetSelC.ReplaceSelD.GetWindowText[答案]:A59.使用()函数获取的设备上下文在退出时必须调用ReleaseDC释放.A.GetWindowsDCB.GetDCC.GetDesktopDCD.GetClientDC[答案]:B60.类CButton不是下列()控件对应的类.A.命令按钮B.单选按钮C.复选框D.静态文本框[答案]:D61.列表框CListBox类的成员函数()用来返回列表框的列表项总数.A.AddString()B.DeleteString()C.ResetContent()D.FindString()E.GetCount()[答案]:F62.滑动条是由滑动块和刻度线构成,按指定增量移动,CSliderCtrl类的成员函数()代表设置滑动块位置.A.SetRange()B.SetPos()C.SetTic()D.SetPoint()E.SetTicFreq()[答案]:B63.滑动条是由滑动块和刻度线构成,按指定增量移动,CSliderCtrl类的成员函数()代表设置刻度线位置,一次只能设置一个刻度线,用于手动设置刻度线.A.SetRange()B.SetPos()C.SetTic()D.SetPoint()E.SetTicFreq()[答案]:C64.滑动条是由滑动块和刻度线构成,按指定增量移动,CSliderCtrl类的成员函数()代表设置刻度线的疏密程度,配合Autoticks属性使用,每隔一定单位自动显示一条刻度线.A.SetRange()B.SetPos()C.SetTic()D.SetPoint()E.SetTicFreq()[答案]:F二,判断题1.UpdateData(true)函数完成成员变量的值传递给控件的操作.[答案]:F2.基于对话框的应用程序,也有文档类和视图类.[答案]:F3.调用DestroyWindow函数完成非模态对话框的销毁工作.[答案]:T4.每个对话框资源都会关联一个对话框类,常派生于CDialog,通过该类对象间接操纵对话框. [答案]:T5.基于对话框的应用程序在运行时也有菜单栏.[答案]:F6.对话框的功能被封装在CDialog类中.[答案]:T7.使用CColorDialog通过对话框类可以显示颜色对话框.[答案]:T8.DDX为对话框数据交换用.[答案]:T9.DDV完成成员变量和控件之间的交换.[答案]:F10.OnOK函数中进行对话框的初始化工作.[答案]:F11.对话框只由对话框类组成.[答案]:F12.从对话框的工作方式看,对话框可分为模式对话框和非模式对话框.[答案]:T13.查找对话框是模式对话框.[答案]:F14.颜色对话框是非模式对话框.[答案]:F15.每一个单选按钮在对话框类中都可以映射一个int类型值变量.[答案]:F16.当编辑框中的文本已被改变,在新的文本显示之后发送EN_CHANGE通知消息.[答案]:T17.CButton类控件只有按键按钮一种类型.[答案]:F18.一组单选按钮在组中的序号从1开始.[答案]:F19.向列表框增加列表项只能使用CListBox类成员的AddString函数.[答案]:F20.一个旋转按钮控件与一个相伴的控件一起使用时,该控件的Tab键次序必须大于旋转按钮. [答案]:F21.进度条控件的操作封装在CProgressCtrl类.[答案]:T22.多个静态文本控件必须有不同的ID号.[答案]:F23.调用Create成员函数创建动态分割窗口.[答案]:T24.调用Create成员函数创建静态分割窗口.[答案]:F25.视图派生类的成员函数通过调用GetDocument函数得到当前文档对象的指针.[答案]:T26.用户可以通过项目工作区窗口的ResourceView视图来查看资源.[答案]:T27.利用MFC编程时,所有的消息与消息处理函数的添加都必须采用ClassWizard类向导来完成.[答案]:F28.窗口是Windows应用程序的基本操作单元,是应用程序与用户之间交互的接口环境,也是系统管理应用程序的基本单位.[答案]:T29.Windows应用程序的入口也是main函数.[答案]:F30.键盘鼠标消息都是命令消息.[答案]:F31.使用MFCAppWizard[exe]向导创建应用程序框架时,向导生成的文件名和类名是不可以更改的.[答案]:F32.消息映射是将消息处理函数与要处理的特定消息连接起来的一种机制.[答案]:T33.命令消息是由菜单项,工具栏按钮和快捷键等用户界面对象发出的WM_COMMAND消息.[答案]:T34.用快捷键F9既可设置断点,又可取消断点.[答案]:T35.调试程序时,会同时出现Variable窗口和Watch窗口.[答案]:T36.Windows是一个基于事件的消息驱动系统.[答案]:T37.MFC采用消息映射来处理消息.[答案]:T38.WM_RBUTTONDOWN是鼠标右键按下时产生的消息.[答案]:T39.给菜单项定义快捷键,只需在菜单项属性设置对话框的Caption文本框中说明即可. [答案]:F40.快捷菜单一般出现在鼠标箭头的位置.[答案]:T41.UPDATE_COMMAND是更新命令用户接口消息.[答案]:F42.工具栏停靠特性只能设置一次.[答案]:T43.状态栏的功能由CToolBar类实现.[答案]:F44.CMenu类,CToolBar类和CStatusBar类的根基类是相同的.[答案]:T45.菜单选择只可以通过鼠标操作来完成.[答案]:F46.状态栏可以通过资源编辑器来编辑.[答案]:F47.MFC应用程序框架为状态栏定义的静态数组indicators放在MainFrm.h文件中. [答案]:F48.在菜单设计时,&字符的作用是使其后的字符加下划线.[答案]:TlientDC代表整个窗口的设备环境.[答案]:F50.删除CPen对象可调用CPen对象的DeleteObject函数.[答案]:F51.DDB又称GDI位图,它依赖于具体设备,只能存在于内存中.[答案]:T52.创建阴影画刷函数是CreateHatchBrush.[答案]:T53.深绿色RGB值为(0,128,0).[答案]:T54.Windows引入GDI的主要目的是为了实现设备相关性.[答案]:F55.Windows用COLORREF类型的数据存放颜色.[答案]:T56.Windows是按图形方式输出字符的.[答案]:T57.TextOut是CDC类中常用的文本输出函数.[答案]:T58.创建画笔后必须调用CDC类的成员函数SelectObject将画笔选人当前设备环境. [答案]:T59.对话框创建后,发送WM_CREATE消息,在该消息处理代码中创建各控件.[答案]:T60.通过AppWizard建立的程序不能被立即执行.[答案]:F61.打开一个项目,只需打开对应的项目工作区文件.[答案]:T62.在同一项目中,VisualC++在内部用来标识资源的资源符号不能重复.[答案]:T63.在Windows环境下,资源与程序源代码紧密相关.[答案]:F64.用户可以通过选择Tools|Customize菜单命令设置集成开发环境的工具栏.[答案]:T65.项目工作区文件的扩展名为dwp.[答案]:F66.Ctrl+F5是编辑程序的快捷键.[答案]:F67.F7是运行程序的快捷键.[答案]:F三,填空题1.项目工作区文件的扩展名是###.[答案]:dsw2.修改公司,描述等信息需用###编辑器.[答案]:Version3.利用###可以快速创建各种风格的应用程序框架,并可自动生成程序通用的源代码.[答案]:应用程序向导4.启动VisualC++,进入VisualC++IDE,从###菜单上选择New菜单项,此时将弹出New对话框[答案]:应用程序向导5.利用###可以快速创建各种风格的应用程序框架,并可自动生成程序通用的源代码[答案]:File6.句柄是Windows使用的一种无重复整数,主要用来###.[答案]:标识应用程序中的一个对象7.一个单文档的MFC应用程序框架一般包括5个类:应用程序类,框架窗口类,###,文档类和文档模板类.[答案]:视图类8.用户点击菜单项后,会产生###消息.[答案]:WM_COMMAND9.改变菜单项文本是使用CCmdUI类的###成员函数.[答案]:SetText10.处理菜单命令消息首先会在###类中.[答案]:视图11.弹出快捷菜单使用的是CMenu类的###函数.[答案]:TrackPopupMenu12.在状态栏中添加文本使用的是CStatusBar类的###函数.[答案]:SetPaneText13.与DOS字符方式下的输出不同,Windows是按###方式输出的.[答案]:图形14.为了体系Windows的设备无关性,应用程序的输出面向一个称为###的虚拟逻辑设备. [答案]:设备环境15.可以利用CGdiObject类的成员函数###将GDI对象设置成指定的库存对象.[答案]:CreateStockObject16.对话框的主要功能是###和输出信息.[答案]:接收用户输入17.使用###函数可用创建非模式对话框.[答案]:Create18.每个控件最多只能关联Control和Value类型成员变量各###个.[答案]:119.一组单选按钮在对话框类中只能映射一个###类型值变量,对应单选按钮在组中的序号,序号从0开始.[答案]:int。
Windows编程实验二实验报告
武汉轻工大学Windows编程实验报告(实验二)姓名:刘文斌院系:数学与计算机学院班级:软件工程13 03班学号: 50老师:刘文涛一、实验目的和要求1、了解CDC类的使用2、掌握常用绘图函数的使用3、学会设置字体4、掌握画笔和画刷的使用5、了解不同文本输出函数的用法二、实验内容【程序1:】编写一个单文档的应用程序,在视图窗口中显示一行文本,要求文本颜色为红色,背景色为黄色。
【程序2:】编写一个单文档的应用程序,在客户区使用不同的画笔和画刷绘制点、折线、曲线、圆角矩形、弧、扇形和多边形等几何图形。
【程序3:】编写一个单文档的应用程序,在视图窗口中显示3个圆,通过使用不同颜色的画笔以及画刷来模拟交通红绿灯。
【程序4:】编写一个单文档的应用程序,在视图窗口实现一行文本的水平滚动显示,要求每个周期文本为红、黄两种颜色,字体为宋、楷两种字体。
三、实验过程1、void CTestView::OnDraw(CDC* pDC){CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);写单文档应用程序test,在视图中显示三个圆,通过使用不同颜色的画笔及画刷来模拟交通红绿灯。
在MFC单文档 onDraw函数中编写如下代码void CTestView::OnDraw(CDC* pDC){CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);写程序test,实现一行文本水平滚动显示,要求每个周期文本为红、黄两种颜色,字体为宋、楷两种字体。
void CTestView::OnDraw(CDC* pDC){CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCFont *OldFont,NewFont;if(flag%2==0){pDC->SetTextColor(RGB(255,0,0));(200,"宋体",NULL);}if(flag%2==1){pDC->SetTextColor(RGB(255,255,0));(200,"楷体",NULL);}OldFont=pDC->SelectObject(&NewFont);pDC->TextOut(x,50,"漂移");pDC->SelectObject (OldFont);SetTimer(1,10,NULL);();}void CTestView::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call default x++;CClientDC dc(this);CRect rect;GetClientRect(&rect);if(x>={x=0;flag++;}Invalidate();CView::OnTimer(nIDEvent);}四、实验总结这次的实验做的时间有点长,不过收获还是蛮多的,比如如何设置文本的字体、颜色等属性。
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程序的基本框架,具体实现会根据具体需求有所不同。
windows高级编程技术习题1
(1) 项目工作区一般在集成开发环境的左侧。
它展示一个工程的几个方面,它们分别是类视图、资源视图和文件视图。
(2) 编译程序的快捷键是Ctrl + F7,链接的快捷键是F7 ,运行程序的快捷键是Ctrl + F5。
(3) 项目工作区文件的扩展名为.dsw。
(4) 应用程序向导AppWizard的作用是帮助用户一步步生成一个新的应用程序,并且自动生成应用程序所需的基本代码,通过ClassWizard可以增加消息映射和成员变量。
(5) 菜单选择可以通过两种方法来进行:一种是;另一种是。
(6) 编译微型条工具栏最右边按钮的功能是设置断点。
2. 选择题(1) 工程文件的扩展名是 b 。
A. .exe B. .dsp C. .dsw D. .cpp(2) 设置断点的默认方式是 d 。
A. LocationB. DataC. MessageD. Breakpoints(3) 用应用程序向导AppWizard创建的C++源文件,应选择 a 选项卡。
A. FilesB. ProjectsC. WorkspacesD. Other Documents(4) Standard工具栏中最左边按钮与 c 菜单命令的功能一样。
A. NewB. New FileC. New Text FileD. New Workspace3. 判断题(1) 用快捷键F9既可设置断点,又可取消断点。
( T )(2) 用户可以通过Tools | Customize菜单命令设置集成开发环境的工具栏。
( T )(3) 通过应用程序向导AppWizard建立的程序不能被立即执行。
( T )(4) 调式程序时,会同时出现Variable窗口和Watch窗口。
( T )4. 简答题(1) 什么是工程? 它是由什么组成的?在Visual C++集成开发环境中,把实现程序设计功能的一组相互关联的C++源文件、资源文件以及支撑这些文件的类的集合称为一个工程。
2025年计算机等级考试一级计算机基础及WPS Office应用试题与参考答案
2025年计算机等级考试一级计算机基础及WPS Office应用复习试题(答案在后面)一、单项选择题(本大题有20小题,每小题1分,共20分)1、以下关于计算机硬件的说法中,正确的是()A、CPU是计算机的心脏,主要负责数据的输入输出。
B、硬盘是计算机的存储设备,用于存放数据和程序。
C、内存是计算机的存储设备,用于存放数据和程序。
D、显示器是计算机的输入设备,用于接收用户的操作指令。
2、WPS Office软件中的“查找”功能主要用于()A、查找文档中的特定文本。
B、查找文档中的图片。
C、查找文档中的表格。
D、查找文档中的页码。
3、题干:在WPS表格中,下列哪种操作可以清除单元格中的内容?A、点击“开始”选项卡中的“清除”按钮B、选择单元格,按下“Delete”键C、点击“开始”选项卡中的“粘贴”按钮D、选择单元格,点击鼠标右键选择“删除”4、题干:在WPS文字中,如果要将选中的文本设置为斜体,应该使用以下哪个按钮?A、格式工具栏中的“斜体”按钮B、开始选项卡中的“斜体”按钮C、插入选项卡中的“斜体”按钮D、视图选项卡中的“斜体”按钮5、在WPS Office中,以下哪个功能可以将文档中的表格内容进行排序?A. 表格工具栏的“排序”功能B. 菜单栏中的“数据”选项卡C. 菜单栏中的“表格”选项卡D. 菜单栏中的“视图”选项卡6、在WPS文字中,以下哪种方式可以快速将选中的文本设置为标题样式?A. 通过样式库中的“标题样式”B. 通过菜单栏中的“格式”→“样式”C. 通过快捷键Ctrl+H打开“查找和替换”对话框,设置样式D. 通过菜单栏中的“格式”→“字体”7、在WPS Office中,以下哪个功能可以实现文档格式的排版?()A、自动更正B、样式C、查找和替换D、字数统计8、以下哪个选项不是WPS文字中的视图模式?()A、页面视图B、阅读视图C、大纲视图D、代码视图9、在WPS Office中,如果需要将文档中的某个特定词汇全部替换为另一个词汇,应该使用以下哪个功能?A. 查找B. 替换C. 修订D. 批注11、在WPS文字中,下列说法错误的是()。
《VC++程序设计》自学指导
《Visual C++程序设计》自学指导"Visual C++程序设计"是面向计算机类各专业的必修计算机类基础课程。
该课程介绍基本的程序设计技术,包括结构化程序设计方法(SP)、面向对象的程序设计方法(OOP)以及使用Visual C++和MFC开发WINDOWS应用程序的技术。
通过本课程的学习,使学生掌握现代程序设计的基本理论和方法,能用Visual C++进行基本的WINDOWS应用程序设计。
本课程的重点在培养学生的实际应用软件开发能力.通过本课程的学习,在结构化程序设计方法和面向对象的程序设计方法的基本理论研究WINDOWS应用程序开发和MFC编程能力方面达到以下基本要求:1.熟悉计算机程序的基本组成要素,包括数据类型、程序流程、函数和指针等基本概念;2.理解结构化程序设计方法(SP)的理论,掌握“自顶向下,逐步求精”的程序设计技术,可设计含有分支、循环和模块(函数)的程序;3.掌握C++的基本流程控制;4.理解类、对象、封装、继承和多态性等面向对象程序设计(OOP)概念,掌握基本的面向对象程序设计方法;5.理解WINDOWS的消息机制和WINDOWS应用程序的基本结构;6.掌握MFC的基本概念,窗口、资源、图形设备接口、文档/视图结构、对话框和控件等对象的程序设计方法,Visual Studio中的AppWizard、ClassWizard、资源编辑器和调试器等工具的方法,可用Visual C++开发基本的WINDOWS应用程序。
第1章C++入门学习目标1.了解Visual C++的特点。
2.熟悉Visual C++集成开发环境的基本使用方法。
3.学习使用Visual C++编写标准的C++控制台程序。
学习重点1.利用Visual C++编写标准的C++控制台程序。
第2章控制结构学习目标1.掌握结构化程序设计方法的基本思想。
2.熟练使用VC++的基本控制结构。
3.熟练使用VC++的控制语句。
Windows应用程序
1、Windows应用程序的最基本构成部分及功能是什么?答:最基本构成部分:入口函数WinMain和窗口函数WndProc.WinMain函数的主要功能:定义、注册窗口类,建立窗口及执行其他必要的初始化工作;进入消息循环,根据从应用程序消息队列接受的消息,调用相应的处理过程;当消息循环检索到WM_QUIT消息时终止程序运行。
窗口函数是应用程序处理接收到的消息的函数。
其中包含了应用程序对各种可能接收的消息的处理。
2、什么是消息循环?Windows应用程序的运行以消息为核心。
Windows将产生的消息放入应用程序的消息队列中,而应用程序的WinMain函数从消息循环提取队列中的消息,并将其传递给窗口函数的相应过程处理。
3、消息是什么?事件驱动的特点是什么?答:消息是描述事件发生的信息。
Windows程序的执行顺序取决于事件发生的顺序,程序的执行顺序是由顺序产生的消息驱动的,但是消息的产生往往并不要求有次序之分。
程序员可以针对消息类型编写程序以处理接收的信息,或者发出其他消息以驱动其他程序,但是不必预先确定消息产生的次序。
4、句柄的作用是什么?答:句柄用于标识应用程序中不同的对象和同类对象中不同的实例,诸如一个窗口、按钮、图标、滚动条、输出设备、控制或者文件。
应用程序通过句柄能够访问相应的对象消息。
5、Windows编程中窗口的含义是什么?答:窗口是Windows应用程序基本的操作单位,是应用程序与用户之间交互的接口环境,也是系统管理应用程序的基本单位。
1、什么是图形设备接口?其作用是什么?答:图形设备窗口是Windows系统的重要组成部分,负责系统与用户或绘图程序之间的信息交换,并控制在输出设备上显示图形或文字。
2、设备无关的好处是什么?答:设备的无关性是操作系统屏蔽了硬件设备的差异,因而设备无关性的图形能使用户编程时无需考虑特殊的硬件设置。
3、如何进行图形的刷新?答:图形刷新包括刷新的请求、系统对刷新请求的响应以及具体的刷新方法。
MFCWindows应用程序设计第三版教学设计
MFCWindows应用程序设计第三版教学设计一、课程简介本课程是针对计算机专业本科生的一门实践课程,旨在培养学生对MFCWindows应用程序设计的实际操作能力。
本课程基于《MFCWindows 应用程序设计第三版》编写,通过课堂教学、实验操作和课程设计,使学生能够掌握Windows应用程序设计的基本原理、技术和方法。
二、教学目标1. 知识与理解1.掌握Windows应用程序开发环境和开发工具的基本概念。
2.熟悉MFC应用程序设计的基本框架和体系结构。
3.理解Windows消息传递和事件处理的机制。
4.理解MFC框架下的对话框、视图、文档等基本组件的概念与使用方法。
5.熟悉基本的用户界面控件的创建、布局和使用方法。
2. 技能与能力1.能够熟练掌握MFC框架下的Windows应用程序的开发流程和方法。
2.能够编写具有基本功能的Windows应用程序和相关工具。
3.能够设计和开发具有一定商业价值的Windows应用程序。
3. 态度与价值观1.具备钻研精神和创新意识,能够解决实际开发中的问题。
2.具备良好的合作意识和团队精神,能够与他人合作完成Windows应用程序的开发任务。
3.具备独立思考和问题解决的能力,能够在Windows应用程序开发中克服和解决遇到的问题。
三、教学内容1. Windows应用程序开发环境1.Windows应用程序的基本概念和结构2.Windows操作系统的基本原理和组成3.开发Windows应用程序的开发环境和基本工具2. MFC应用程序设计入门1.MFC框架下的Windows应用程序基本框架和结构2.MFC应用程序的消息传递和事件处理机制3.MFC应用程序中的对话框、视图和文档等基本组件4.用户界面控件的创建、布局和使用方法3. Windows应用程序的高级开发1.数据库应用程序开发2.动态链接库和静态链接库的使用3.面向对象程序设计的高级技巧4.安全和性能优化技术4. 课程设计1.开发一个具备实用功能的Windows应用程序2.完成Windows应用程序的测试和部署3.撰写课程设计报告和PPT演示四、教学方法1.讲课与互动式授课相结合,提高学生的参与度和学习效果。
第1章-Visual-FoxPro基础精选全文
1.4 VFP项目管理器
1.项目的建立-菜单法 第一步: “文件”菜
单“新建”,启动 “新建”对话框,或单 击工具栏中的“新建” 图标,系统将弹出“新 建”对话框 选择“项目”选项。然 后单击“新建文件”按 钮
1.4 VFP项目管理器
第二步:在弹出的 “新建”对话模式 中确定存放项目文件 的路径,输入项目名 称(默认名称为“项 目1”),单击“保存” 按钮,即可建立一个 新项目。
浏览器 :IE4.0或更高版本 CPU:80486 66MHz以上 内存:16M以上 硬盘:典型安装85MB,最大安装90MB 其他:鼠标和光驱等
1.2 VFP 6.0的运行环境、安装、启动与退出
二、安装
将VFP6.0 安装盘CD-ROM放入光驱找到序列号 文件(若需要)找到setup.exe,双击安装安装过程 根据提示选择或选择下一步,直到完成。
1.2 VFP 6.0的运行环境、安装、启动与退出
三、启动
方法 一: “ 开 始” “ 所有 程序 ” “ Microsoft Visual FoxPro 6.0”
方法二:双击桌面上的快捷方式(如果有) 方法三:单击任务栏中的快捷方式(如果有)
1.2 VFP 6.0的运行环境、安装、启动与退出
学习一门新课首要解决的两个问题:
1.为什么要学习这门课? 2. 这门课能干什么?
?
什么是VFP?
DBMS OR(+) Programming Language
?
自己带有数据库的程序,并且同时添加了一组可以在数据上执行的命令 为数据处理而生
VFP能做什么?
信息系统 数据库系统 桌面信息系统
VFP发展历程
发展总过程:
DBase→Foxbase→Foxpro→Visual Foxpro (1)DBase阶段 Dbase: Ashton Tate公司(80年代初期) (2)FoxBase 和 FoxPro阶段 Foxbase :Fox公司(1986) Foxpro 1.0:Fox公司(1989)
MFC期末复习简答题及答案
MFC 期末复习及答案1 简述MFC 应用程序的执行过程。
2 简述文档/视图与其他类对象的关系。
3 简述MFC 消息映射机制。
4 消息WM_LBUTTONDOWN 的消息映射宏和消息处理函数是什么?5 如何自定义消息?如何发送自定义消息?6 GDI 创建哪几种类型的图形输出?7 什么是设备环境?它的主要功能有哪些?8 什么是GDI,它有什么功能?MFC 将GDI 函数封装在哪个类中?9 请叙述设备无关性的含义,实现设备无关性需要哪几个环节?10 MFC 提供了哪几种设备环境类?它们各自有什么用途?11 简述传统的SDK 获取设备环境的方法。
12 简述创建和使用自定义画笔的步骤。
13 简述采用MFC 方法编程时,显示一个DDB 位图的步骤。
14 简述菜单设计的主要步骤。
15 为应用程序创建快捷菜单主要有哪些方法?16 如何动态创建菜单?17 创建工具栏的基本步骤有哪些?18 简述MFC 创建状态栏所做的工作。
19 简述创建和使用模态对话框的主要步骤。
20 如何向对话框模板资源添加控件?如何添加与控件关联的成员变量?21 什么是DDX 和DDV?编程时如何使用MFC 提供的DDX 功能?22 简述创建属性页对话框的主要步骤。
23 在应用程序中访问控件的方法有哪些?24 单选按钮控件如何成组?25 组合框与列表框相比有什么不同?如何给组合框添加初始的列表项?26 通过哪几个主要成员函数完成文档与视图之间的相互作用?并简述这些成员函数的功能。
27 简述文档序列化与一般文件处理的区别。
28.如何让用户定义的类支持序列化?1 简述MFC 应用程序的执行过程。
MFC 应用程序启动时,首先创建应用程序对象theApp。
这时将自动调用应用程序类的构造函数初始化对象theApp,然后由应用程序框架调用MFC 提供的WinMain( )主函数。
在WinMain( )主函数中,首先通过调用全局函数GetApp( )来获取theApp 的指针pApp,然后通过该指针调用theApp 的成员函数InitInstance( )来初始化应用程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第12章文档与视图MFC提供了将应用程序的数据与显示分开的文档-视图结构,它为应用程序提供了统一的框架,参见图12-1和图12-2。
MFC的文档-视图结构是MVC模式的一种部分实现。
图12-1 SDI应用程序中的对象图12-2 文档-视图结构中各种对象及其创建与关系12.1 MVCMVC是一种软件架构模式,通过分解程序的不同功能,达到降低程序设计的复杂度、利于程序员专业分工、简化程序的维护和扩展的目的。
MVC是1979年挪威计算机科学家Trygve Reenskaug在Xerox(施乐公司)PARC(Palo Alto Research Center,帕洛阿尔托研究中心)工作时,为(历史上第二个面向对象程序设计语言和第一个真正的集成开发环境)SmallTalk提出的。
12.1.1 概念MVC(Model-View-Controller,模型—视图—控制器)是一种软件架构模式,它把软件系统分为如下三个基本部分(参见图12-3):●模型(Model)——数据(库)。
●视图(View)——图形界面(表示)。
控制器(Controller)——程序功能(算法)。
图12-3 MVC模式的关系图MVC模式的目的是实现一种动态的程序设计,简化对程序的后续修改和扩展,并且使程序某一部分的重复利用成为可能。
除此之外,此模式通过对复杂度的简化,使程序结构更加直观。
软件系统通过对自身基本部份分离的同时,也赋予了各个基本部分应有的功能,专业人员可以通过自身的专长进行分组合作:数据库专家利用“模型”进行数据管理和数据库设计、界面设计人员利用“视图”进行图形界面设计、而程序员则利用“控制器”编写程序应有的功能(实现算法等等)。
12.1.2 层次模型(Model,数据模型)用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。
“模型”有对数据直接访问的权利,例如对数据库的访问。
“模型”不依赖“视图”和“控制器”,也就是说,模型不关心它会被如何显示或是如何被操作。
但是模型中数据的变化一般会通过一种刷新机制被公布。
为了实现这种机制,那些用于监视此模型的视图必须事先在此模型上注册,从而,视图可以了解在数据模型上发生的改变。
(比较:观察者模式(软件设计模式))视图(View)视图层能够实现数据有目的的显示(理论上,这不是必需的)。
在视图中一般没有程序上的逻辑。
为了实现视图上的刷新功能,视图需要访问它监视的数据模型(Model),因此应该事先在被它监视的数据那里注册。
控制器(Controller)控制器起到不同层面间的组织作用,用于控制应用程序的流程。
它处理事件并作出响应。
“事件”包括用户的行为和数据模型上的改变。
12.1.3 实现●S mallTalk1980年MVC最早被应用于Xerox PARC的面向对象、动态类型、自反射的编程语言SmallTalk-80环境中,运行在首个具有GUI的原型计算机Alto(男高音)上。
●M acApp1985年Apple将MVC用于其推出的Mac OS系统的面向对象的应用程序框架MacApp 中,这是MVC首次在商用产品中的实际应用。
●M FC1993年2月微软在其随Visual C++ 1.0推出的MFC 2.0中,引入了文档-视图(Document / View)架构,它也是一种对于MVC的早期部分实现。
MFC将程序分成视图(View)和文档(Document)两大类,其中的CDocument对应MVC中的数据模型(Model),CView相当于MVC中的视图+控制(View+Controller),再加上应用程序类CWinApp,合成三大项。
但是MFC基本上是一个失败的MVC作品。
由于MFC对Document/View的定义过于模糊,未将Controller(消息映射)部份取出,因此Controller既可置入View也可置入Document,但不管置入哪一方面,都会与View或Document绑死而缺乏弹性。
●J ava EE——Struts1999年12月Sun推出的Java EE(Java Enterprise Edition,Java企业版,原来叫J2EE)和其他的各种框架不一样,它为模型对象(Model Objects)定义了一个规范。
典型例子是由Craig McClanahan于2000年5月所开发的开源Java EE轻型Web应用框架Apache Struts。
⏹视图(View) ——在JA V A EE应用程序中,视图(View)可能由JSP(Java ServerPage,爪哇服务器网页)承担。
生成视图的代码则可能是Servlet的一部分,特别是在客户端服务端交互的时候。
⏹控制器(Controller) ——JA V A EE应用中,控制器可能是一个Servlet。
⏹模型(Model) ——模型则是由一个实体Bean来实现。
●.NET——Windows Forms2002年2月微软所推出的.NET框架中还包含有WinForms(视窗窗体),这个针对视图(View)和控制器(Controller)的模式已被很好地定义,而模型(Model)则留给开发者去设计。
⏹视图(View)——由Form或者Control类继承来的一个类处理视图的职责。
在WinForm这个例子中视图和控制器被编译在同一个类中,这个和不同。
⏹控制器(Controller)——控制器的职责被分割成三部分。
事件(Event)的产生和传输是操作系统的一部分。
在.Net框架中Form和Control类将不同的事件转发给相应的事件处理器。
而事件的处理则在分离的代码中实现。
⏹模型(Model)——就像一样,WinForm不严格需要一个模型。
开发者可以自行选择创建一个模型类,但是很多人选择放弃这一步,直接把事件处理放在控制器里处理任何计算、数据保存等等。
也就是说用模型来包含商业逻辑和数据访问。
●.NET——2002年2月微软随.NET推出了,针对视图(View)和控制器(Controller)的模式并没有被很好地定义,模型(Model)也留给开发者去设计。
⏹视图(View)——ASPX和ASCX文件被用来处理视图的职责。
在这个设计中视图实际上是从控制器继承而来。
这个和Smalltalk的实施有所不同,在Smalltalk中不同的类都有指针互相指向对方。
⏹控制器(Controller)——控制器的职责被分割成两部分。
事件(Event)的产生和传输是框架的一部分,更明确的说是Page和Control两个类。
而事件的处理则在分离的代码中实现。
⏹模型(Model)—— 不严格需要一个模型。
开发者可以自行选择创建一个模型类,但是很多人选择放弃这一步,直接把事件处理放在控制器里处理任何计算、数据保存等等。
但用模型来包含商业逻辑和数据访问是可实现的。
2009年4月9日微软推出了 MVC 1.0,它在 3.5运行库之上提供了一个新的MVC架构。
此架构为Web应用程序文件夹(folder)结构定义了一个特别模式,并提供了一个控制器基类来处理“动作(actions)”请求。
MVC 2.0将随.NET框架4.0和Visual Studio 2010一起推出。
12.2 文档-视图体系文档(document)对应于用户的数据(可以是文本、数值、图像、声音、视频等),它可以从磁盘文件中读入,也可写入磁盘文件,用户还可以创建、修改和管理这些数据。
文档对应的MFC类为CDocument。
视图(view)是一种窗口对象,对应于框架窗口的客户区,它负责在屏幕和打印机上显示和输出数据,为用户提供观察、选择、编辑文档数据的交互界面(参见图12-4)。
视图对应的MFC类为CView。
文档-视图结构有两种主要的方式:SDI(Single DocumentInterface,单文档界面)和MDI(Multiple Document Interface,多文档界面)。
从MFC 7.0起新增加了一种MTDI(Multiple Top-level Document Interface,多顶级文档界面),参见图11-5。
SDI 传统MDI 选项卡式MDI MTDI图11-5 不同的文档界面SDI应用程序只有一个框架窗口(类)和一个视图窗口(对应于框架窗口的客户区),且只有一个文档类,每次只能打开一个文档。
这里的文档和视图一般是一一对应的。
例如Windows中的记事本、写字板和画图等软件,是典型的SDI应用程序。
MDI应用程序有一个主框架窗口(类),可有任意多个子框架窗口和对应的视图客户区窗口,也可有多个文档类,可以同时打开多个文档/窗口。
这里,每个视图对应于一个文档,而每个文档则可对应于多个视图,参见图12-6。
例如Word 2000和IE 8,分别是传统和选卡式MDI应用程序。
MTDI类似于MDI,只是MDI中的每个文档视图窗口都是主框架窗口的子窗口(只能位于主框架窗口的客户区内)。
而MTDI的文档视图窗口都是顶层窗口,位于主框架窗口之外。
例如新版Word和老版IE,就是典型的MTDI应用程序。
应用程序的文档-视图结构种类,可以在创建MFC应用程序时,在“MFC应用程序向导”对话框的“应用程序类型”页中设置(默认为MDI),在该对话框页中还可以选择是否图12-4 文档与视图图12-6 一个文档可对应多个视图具有“文档/视图结构支持”(默认是选中的),参见图12-7。
图12-7 MFC应用程序向导中的“文档/视图结构支持”选项12.2.1 文档模板类文档、框架窗口与视图通过文档模板联系在一起,MFC的文档模板类为CDocTemplate。
对SDI与MDI,它有两个对应的派生类CSingleDocTemplate与CMultiDocTemplate,在MFC 功能包中又增加了多文档模板的扩展类CMultiDocTemplateEx,参见图12-8。
图12-8 文档模板类的层次结构它们的构造函数的参数都一样:C[Single|Multi]DocTemplate[Ex] ( // 文档模板构造函数UINT nIDResource, // 文档类型的资源IDCRuntimeClass* pDocClass, // 派生文档类对象的指针CRuntimeClass* pFrameClass, // [派生]框架窗口类对象的指针CRuntimeClass* pViewClass // 派生视图类对象的指针);CWinApp类创建文档模板的操作分两步进行,首先用文档模板类的构造函数创建一个SDI或MDI文档模板的实例,然后调用CWinApp类的成员函数AddDocument将该模板添加到应用程序的模板列表中。
创建文档模板的操作,一般在派生应用程序类的InitInstance 成员函数中完成。