第2讲MFC应用程序框架及文档视图架构

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第2讲 MFC程序框架及文档视图架构
主要内容
认识一个简单的MFC程序 MFC程序开发流程与集成开发环境 MFC应用程序框架 文档视图架构
认识一个简单的MFC程序
制作一个简单的MFC程序
应用AppWizard生成你的第1个MFC程序: MySDI SDI与MDI 编译、运行之 浏览程序代码与资源
集成开发环境--Visual C++ 6.0 IDE
//动态生成,返回对象指针 //类支持动态生成,必须有 //DECLARE_DYNCREATE(CMainFrame) //IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CMySDIDoc), // main SDI frame window RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(CMySDIView)); AddDocTemplate(pDocTemplate); // Parse command line for standard shell commands, DDE, //file open CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo);
//Dispatch commands specified on the command line if (!ProcessShellCommand(cmdInfo)) return FALSE; // The one and only window has been initialized, //so show and update it. m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow();
文档模板类 CDocTemplate
文档模板类用来管理文档对象、视图对象、窗 口对象和应用程序资源 文档模板对象在应用程序对象中的创建
文档模板类对象分析
文档视图架构的产生
文档模板类管理资源
资源ID:IDR_MAINFRAME 代表使用的资源:菜单,图表,字符串等。 用\n隔开的七个子串,描述文档类型。可在 AppWizard第4步指定,或直接更改。
封装:类接口与实现的分离 继承:开发者坐享其成 多态:开发者加入业务逻辑
深入理解MFC应用程序
WinMain在哪?程序如何开始执行? Window Procedure在哪?窗口如何运行? RegisterClass和CreateWindow在哪?窗口 如何创建? Message Loop ( GetMessage和 DispatchMessage )在哪?程序如何运转?
文Baidu Nhomakorabea视图架构的思想
数据嵌入文档中,利用文档的架构管理 文档与视图通信,使数据在视图中显示 视图显示数据,并与用户交互 视图放入窗口中 文档模板类对象管理上述对象协调工作 查看程序代码
文档视图架构中主要类
The CDocument Class The CView Class The CMainFrame Class The Document Template Class
各菜单功能 Workspace中的ClassView、ResourceView和 FileView 资源编辑器
Dialog Editor Menu Editor Accelerator Editor Toolbar Editor Version Information Editor String Editor Graphice Editor
视图类的派生类
窗口类CFrameWnd
CDocument和CView互为表里 CMainFrame 是容器
窗口 文档
视图
窗口类中重要的成员函数
Create ActivateFrame InitialUpdateFrame GetActiveFrame SetActiveView GetActiveView CreateView GetActiveDocument EnableDocking OnCreateClient OnContextHelp ……,查看MSND
CWinApp中可改写的四个函数
InitInstance CXXXApp仅必须被Override的函数InitInstance Run ExitInstance OnIdle 空闲时间处理 当消息队列空闲时,系统自动调用此函数,通常在 CMySDIApp中改写此函数完成后台任务。 看MSDN例子 右击CMySDIApp,选择Add Virtual Function,双击OnIdle,击OK。 拷贝MSDN中的代码,运行之。(代码见下一页) TRACE宏用于格式化输出,只在调试状态能用.
MFC并没有封装整个API,给了程序员很大的灵活性。
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
文档类 CDocument
CDocument是负责管理数据的类,它的作用:
程序员应将用户的实际数据对象内嵌在 CDocument中,利用框架的数据处理; 完成与CView类通信。
在程序中实现CDocument的派生类,以便嵌 入数据对象,并改写成员函数实现对数据处理。
文档类中重要的成员函数
OnNewDocument (可改写) OnOpenDocument (可改写) DeleteContents (可改写) Serialize(可改写) GetFirstViewPosition GetNextView GetPathName GetTiTle IsModified SetModifiedFlag UpdateAllViews ……,查看MSND,不需死记硬背,在实践中逐步熟悉
Application Framework
什么是MFC应用程序框架
提供了一般应用程序需要的全部面向对象软件组件 的集成集合。
好处
是C++的Windows API
标准结构的专业化的程序,面向对象思维 运行速度快 降低编码复杂性,代码重用,良好工具支持
分析你已生成的SDI程序
面向对象的特点
BOOL bMore = CWinApp::OnIdle(lCount); if (lCount == 0) { TRACE("App idle for short period of time\n"); bMore = TRUE; } else if (lCount == 10) { TRACE("App idle for longer amount of time\n"); bMore = TRUE; } else if (lCount == 100) { TRACE("App idle for even longer amount of time\n"); bMore = TRUE; } else if (lCount == 1000) { TRACE("App idle for quite a long period of time\n"); } return bMore;
例:在视图中显示文档数据
文档数据
在C*Doc中加入一个CString变量str 在构造函数中初始化
在视图中显示
在C*View类的OnDraw()函数中显示数据 CRect rect(0,0,700,700); pDC->DrawText(pDoc->str,&rect, DT_CENTER);
CWinApp---WinMain---程序启动
程序启动步骤
生成theApp对象 WinMain AfxWinMain CMySDIApp : : InitInstance 创建窗口对象 显示并重绘窗口 执行Run,并进入消息循环
用Call Stack调试,观察函数调用栈
BOOL CMySDIApp::InitInstance() { AfxEnableControlContainer(); //支持ActiveX #ifdef _AFXDLL Enable3dControls();//Call this when using MFC in a shared DLL #else Enable3dControlsStatic();//Call this when linking to MFC statically #endif //注册到注册表:HKEY_CURRENT_USER\Software // such as the name of your company or organization. SetRegistryKey(_T("Local AppWizard-Generated Applications")); // Load standard INI file options (including MRU) LoadStdProfileSettings();
视图类 CView
视图类是负责显示CDocument中数据的类
必须从CView派生自己的类,并至少改写成员函数 OnDraw或OnPrint,实现数据显示 框架自动调用OnDraw函数 WM_PAINT消息 OnPaint() OnDraw() 处理与用户的交互
视图类中重要的成员函数
GetDocument (可改写) OnDraw (可改写) OnInitialUpdate (可改写) OnUpdate (可改写) OnActivateView (可改写) OnPrepareDC (可改写) ……,查看MSND
MFC程序开发流程
MFC应用程序框架
Microsoft Foundation Class MFC类库简介:约250个类 MFC的主要特点:
是建立在Win32 API之上的C++类库,利用面向对象 的原理,组织起数以千计的API;
提供了基于Windows应用程序设计的主要框架,使 程序设计过程更有效率,更符合面向对象的精神
CFrameWnd---WndProc
创建窗口对象时调用了Create函数,用于创 建窗口并与CFrameWnd的对象相关联,做初 始化,注册等工作。 OnCreate函数在窗口创建之后,显示之前被 调用。在CMainFrame中改写这个函数用于初 始化你自己的窗口特征。
文档视图架构
文档视图架构是MFC应用程序框架的核心 是MFC之所以成为应用程序框架的关键 它将管理数据的程序代码与与显示数据的程序 代码分开 架构中利用虚函数构建了数据处理与显示的框 架(对象之间的消息传递) 程序员只需在派生类中改写它们,完成特定的 数据处理与显示
集成开发环境--Visual C++ 6.0 IDE
ClassWizard
使MFC类库的使用更简单方便 实质是有一个数据文件,每次打开IDE时读取或 生成。 且仅用于MFC应用程序编程 可以支持的工作有 MFC message maps Automation dispatch maps 对话框类的 DoDataExchange
return TRUE;
} //之后调用Run,进入消息循环。
CWinApp---程序运行与结束
运行
在CWinApp :: Run中的消息循环中执行。消息处 理部分将详细讲解MFC消息的处理
结束
直到CWinApp :: Run 收到 WM_QUIT消息,结 束消息循环,调用CWinApp :: ExitInstance函数, 这是一个虚函数,当在CMySDIApp中改写了 ExitInstance函数时,则CWinApp :: Run 调用 的就是CMySDIApp :: ExitInstance
相关文档
最新文档