




已阅读5页,还剩33页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.,1,第2讲MFC程序框架及文档视图架构,.,2,MFC简介,Windows编程的基本方式,.,3,API(ApplicationProgrammingInterface),是由Windows操作系统提供的函数定义、参数定义和消息格式的集合,用于提供给应用程序使用,MFC(MicrosoftFoundationClass),微软基础类库封装了大量API函数提供了图形环境下的程序设计框架,使程序设计过程更有效率,更符合面向对象的精神简化了Windows程序设计,.,4,MFC应用程序框架,什么是MFC应用程序框架提供了一般应用程序需要的全部面向对象软件组件的集成集合好处是C+的WindowsAPI标准结构的专业化的程序,面向对象思维运行速度快降低编码复杂性,代码重用,良好工具支持,.,5,理解MFC应用程序,WinMain在哪?程序如何开始执行?WindowProcedure在哪?窗口如何运行?RegisterClass和CreateWindow在哪?窗口如何创建?MessageLoop(GetMessage和DispatchMessage)在哪?程序如何运转?,.,6,MFC程序结构,基于框架窗口的应用程序(早期的MFC)程序运行管理、窗口及数据管理分开两部分,与SDK程序类似基于文档/视图的应用程序单文档应用程序(重点)程序运行管理、窗口管理、交互管理、数据管理分开多文档应用程序基于对话框的应用程序程序运行管理、对话框管理分开,.,7,MFC程序的文档/视图结构,早期MFC应用程序用应用程序类实现应用程序的初始化、消息循环、终止;用窗口框架类管理窗口,包括数据管理、显示、与用户交互等目前的MFC应用程序都采用文档/视图结构,把原来窗口框架类的工作分开窗口框架类管理窗框视图类(即视窗类)管理数据显示、接收用户输入文档类负责数据管理,.,8,使用文档/视窗结构的好处将数据操作与数据显示分开,可以简化工作量一组数据可以同时以不同的形式显示在多个视窗中窗框类、视窗类、文档类之间的关系窗框类相当于窗户的窗框视窗类相当于窗户上的玻璃文档类相当于房间中的物品在房间外边可以透过玻璃看到室内部分物品房间可以有多个窗户,可以从不同角度透过不同窗户看到室内同一物品,.,9,文档视图架构的思想,数据嵌入文档中,利用文档的架构管理文档与视图通信,使数据在视图中显示视图显示数据,并与用户交互视图放入窗口中文档模板类对象管理上述对象协调工作,.,10,MFC程序中主要的类(基于文档),MFC把程序中的数据、函数都封装在若干个类中应用程序类CWinApp及其派生类封装了Windows应用程序初始化、运行、终止应用程序的代码应用程序中不再出现WinMain函数,其功能被封装在CWinApp类的成员函数中消息的响应则采用消息响应机制来实现窗口边框类CFrameWnd及其派生类管理应用程序的边框窗口,包括窗框的大小、标题、菜单条、状态条等部分。(工具栏不属于框架窗口,而是框架窗口的子窗口,但由框架类管理)视窗CView类及其派生类管理应用程序窗口中显示数据的部分(用户区)负责各种数据的显示、与用户的交互等工作文档类CDocument及其派生类管理应用程序中的数据,如存储、修改等,.,11,CWinApp-WinMain-程序启动,程序启动步骤生成theApp对象WinMainAfxWinMainCMySDIApp:InitInstance创建窗口对象显示并重绘窗口执行Run,并进入消息循环,.,12,BOOLCMySDIApp:InitInstance()AfxEnableControlContainer();/支持ActiveX#ifdef_AFXDLLEnable3dControls();/CallthiswhenusingMFCinasharedDLL#elseEnable3dControlsStatic();/CallthiswhenlinkingtoMFCstatically#endif/注册到注册表:HKEY_CURRENT_USERSoftware/suchasthenameofyourcompanyororganization.SetRegistryKey(_T(LocalAppWizard-GeneratedApplications);/LoadstandardINIfileoptions(includingMRU)LoadStdProfileSettings();/动态生成,返回对象指针/类支持动态生成,必须有/DECLARE_DYNCREATE(CMainFrame)/IMPLEMENT_DYNCREATE(CMainFrame,CFrameWnd)CSingleDocTemplate*pDocTemplate;pDocTemplate=newCSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CMySDIDoc),RUNTIME_CLASS(CMainFrame),/mainSDIframewindowRUNTIME_CLASS(CMySDIView);AddDocTemplate(pDocTemplate);,.,13,/Parsecommandlineforstandardshellcommands,DDE,/fileopenCCommandLineInfocmdInfo;ParseCommandLine(cmdInfo);/Dispatchcommandsspecifiedonthecommandlineif(!ProcessShellCommand(cmdInfo)returnFALSE;/Theoneandonlywindowhasbeeninitialized,/soshowandupdateit.m_pMainWnd-ShowWindow(SW_SHOW);m_pMainWnd-UpdateWindow();returnTRUE;/之后调用Run,进入消息循环,.,14,CWinApp-程序运行与结束,运行在CWinApp:Run中的消息循环中执行结束直到CWinApp:Run收到WM_QUIT消息,结束消息循环,调用CWinApp:ExitInstance函数这是一个虚函数,当在CMySDIApp中改写了ExitInstance函数时,则CWinApp:Run调用的就是CMySDIApp:ExitInstance,.,15,CWinApp中可改写的四个函数,InitInstanceRunExitInstanceOnIdle空闲时间处理当消息队列空闲时,系统自动调用此函数,通常在CMySDIApp中改写此函数完成后台任务。看MSDN例子右击CMySDIApp,选择AddVirtualFunction,双击OnIdle,击OK。拷贝MSDN中的代码,运行之TRACE宏用于格式化输出,只在调试状态能用,.,16,CFrameWnd-WndProc,创建窗口对象时调用了Create函数,用于创建窗口并与CFrameWnd的对象相关联,做初始化,注册等工作。OnCreate函数在窗口创建之后,显示之前被调用。在CMainFrame中改写这个函数用于初始化你自己的窗口特征,.,17,窗口框架类CFrameWnd,用于派生应用程序的窗口框架类每个窗口有一个窗口框架类框架窗口的用户区中容纳视图窗口作用管理窗口标题栏、菜单栏、工具栏、状态栏、边框等,窗口框架,文档,视图,.,18,窗口框架类中重要的成员函数,CreateActivateFrameInitialUpdateFrameGetActiveFrameSetActiveViewGetActiveViewCreateViewGetActiveDocumentEnableDockingOnCreateClientOnContextHelp,查看MSND,.,19,文档类CDocument,CDocument是负责管理数据的类应用程序中的文档类是这个类的派生类作用数据管理程序员应将用户的实际数据对象内嵌在自己的文档类中需要与自己的视图类通信在程序中实现CDocument的派生类,以便嵌入数据对象,并改写成员函数实现对数据的处理,.,20,文档类中重要的成员函数,OnNewDocument(可改写)OnOpenDocument(可改写)DeleteContents(可改写)Serialize(可改写)GetFirstViewPositionGetNextViewGetPathNameGetTiTleIsModifiedSetModifiedFlagUpdateAllViews,查看MSND,不需死记硬背,在实践中逐步熟悉,.,21,视图类CView,用于派生应用程序的视图类作用处理与用户的交互显示文档类中的数据接收用户输入(例如鼠标操作)通常要改写视图类的成员函数OnDraw或OnPrint,实现数据显示框架自动调用OnDraw函数WM_PAINT消息OnPaint()OnDraw(),.,22,视图类中重要的成员函数,GetDocument(可改写)OnDraw(可改写)OnInitialUpdate(可改写)OnUpdate(可改写)OnActivateView(可改写)OnPrepareDC(可改写),查看MSND,.,23,视图类的派生类,.,24,视图类与文档类的关系,视图类与文档类为先后台(前店后库)一个文档类对象可以对应多个视图类对象每个视图类对象可以从不同角度反映文档(数据)情况一个视图类对象只能对应一个文档类对象,.,25,基于多文档的应用程序,一个应用程序类一个主框架类多个窗口框架类每个对应一个文档类对象对应一个或多个视图类对象,.,26,用MFC编写应用程序,使用MFC的AppWizard可以按编程者的选择,自动生成程序源代码,它是一个框架程序,编程者可在此基础上修改、添加程序,极大地方便了程序的设计难点生成的源代码较复杂(对一般人不必全看懂)核心代码被封装起来,在生成的源代码中没有涉及了大量的类成员函数,使用时要了解这些成员函数的用法,工作量较大要学会使用MSDN,.,27,2种文档/视图结构应用程序,单文档界面(SDI)应用程序用户在一个时刻只能操作一个文档例如Windows的“记事本”程序有一个框架窗口(应用程序框架窗口就是文档应用程序框架窗口)多文档界面(MDI)应用程序用户在一个时刻可以操作多个文档例如Windows的Word程序有一个应用程序框架窗口,每个文档还各有一个文档框架窗口,.,28,类的继承关系,本课程中用到的基类,.,29,MFC对名称的约定,类的声明与类的实现放在不同文件类的声明在.h文件中类的实现代码在.cpp文件中类名的约定类名以大写C开头自动生成的类的名称中含有项目名(框架类除外)用户定义的类名建议以C开头文件名约定类名去掉前面的C,.,30,以项目名称“Hello”为例的SDI程序例:,应用程序类:CHelloApp(基类CWinApp)类的声明存放在Hello.h中类的实现代码在Hello.app中主框架类:CMainFrame(基类CFramewnd)类的声明存放在MainFrm.h中类的实现代码在MainFrm.app中文档类:CHelloDoc(基类CDocument)类的声明存放在HelloDoc.h中类的实现代码在HelloDoc.app中视窗类:CHelloView(基类CView)类的声明存放在HelloView.h中类的实现代码在HelloView.app中,.,31,匈牙利表示法(命名规则),函数命名规则函数名=动词+名词动词和名词的第一个字母大写例GetMessage变量命名规则小写字母前缀表示变量的类型,其余的部分描述变量的功能例nCount,.,32,AppWizard、ClassWizard的使用案例3.2,要求当鼠标在窗口中移动时,在窗口显示鼠标的位置坐标当按下鼠标左键时,在窗口显示鼠标单击点的坐标放开鼠标左键时,在窗口显示“鼠标左键被释放”按可显示字符键时,从窗口的左上角开始显示输入的字符,.,33,分析,鼠标在窗口用户区操作,是视窗类管理的范围为捕捉鼠标移动位置,要响应鼠标的WM_MOUSEMOVE消息为捕捉鼠标单击点的坐标,要响应鼠标的WM_LBUTTONDOWN、WM_LBUTTONUP消息为了解敲击了哪些字符键,要响应WM_CHAR消息为显示信息,除要用到输出字符串的函数外,还要考虑在什么地方使用输出字符串函数问题上述这些消息应该是哪个对象的?,.,34,程序要点,为视窗类添加成员变量,并在构造函数中把m_nLine初始化为0CStringm_MousePoint;/用于显示不同的字符串CStringm_strDisplay;/接收键盘输入的字符intm_nLine;/对键盘输入的文本行计数利用ClassWizard映射鼠标左键按下、放开、鼠标移动、WM_CHAR消息输出字符串用CDC:TextOut函数需要有一个CDC对象或它派生的对象因多处需要输出,可把输出代码放到视窗类的OnDraw函数中,此函数在窗口重画时被调用,输出代码放在这里可以保证总被显示,例如窗口尺寸变化时,.,35,voidCMyHelloView:OnLButtonDown(UINTnFlags,CPointpoint)m_MousePoint.Format(鼠标左键在(%d,%d)处按下,point.x,point.y);Invalidate();/引起视窗重画CView:OnLButtonDown(nFlags,point);voidCMyHelloView:OnLButtonUp(UINTnFlags,CPointpoint)m_MousePoint=鼠标左键被释放;Invalidate();CView:OnLButtonUp(nFlags,point);voidCMyHelloView:OnMouseMove(UINTnFlags,CPointpoint)m_MousePoint.Format(鼠标指针位于(%d,%d)处,point.x,point.y);Invalidate();CView:OnMouseMove(nFlags,point);,.,36,voidCMyHelloView:OnDraw(CDC*pDC)CMyHelloDoc*pDoc=GetD
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年教师招聘之《小学教师招聘》通关题库附参考答案详解【b卷】
- 量子力学常数测量创新创业项目商业计划书
- 智能车窗遮阳帘与隐私保护创新创业项目商业计划书
- 老酒交易平台创新创业项目商业计划书
- 水产养殖智能设备创新创业项目商业计划书
- 遥感测绘服务创新创业项目商业计划书
- 2025年教师招聘之《小学教师招聘》通关练习题和答案及完整答案详解【网校专用】
- 2025年重庆西南大学附中高三语文第一学期期末调研模拟试题
- 2025年赛力皮革染料项目合作计划书
- 教师招聘之《幼儿教师招聘》考前自测高频考点模拟试题及参考答案详解(模拟题)
- 加工番茄栽培技术及病虫害防治
- 数据可视化课程建设经验交流陈为课件
- 二级减速器计算说明书
- 厨房设备施工方案
- 《比热容》说课-完整版课件
- 北京市各县区乡镇行政村村庄村名明细
- 各种轴载换算计算方法
- (高职)《会展策划》(第三版)ppt课件(完整版)
- 商超类企业抖音代运营方案(综合)
- 海上保险法课堂笔记(国航上课版)
- 精选文档大跨度梁板混凝土浇筑方案
评论
0/150
提交评论