VC第三章,MFC框架之文档与视图.ppt
《VC第三章,MFC框架之文档与视图.ppt》由会员分享,可在线阅读,更多相关《VC第三章,MFC框架之文档与视图.ppt(44页珍藏版)》请在三一文库上搜索。
1、第三章 MFC框架之文档与视图,本章内容,MFC应用程序的开发流程 AppWizard生成的文件类型 ClassWizard的功能与应用初步 用户工程中“文档与视图结构” 菜单设计及应用 鼠标消息的处理 工具栏与状态栏设计 文档的读写 滚动视图与多视图,一、MFC应用程序的开发流程 创建一个应用程序框架 为新工程添加必要的资源,如菜单、对话框 按程序功能要求,为其添加新类及其类成员 编写类的成员函数的实现代码 编译、链接,修改错误,生成EXE文件 运行并测试新程序,修正设计缺陷 将程序由调试版升级为正式发行版,MFC应用程序开发流程图,二、AppWizard生成的文件类型,MFC中资源标识符前
2、缀,三、ClassWizard的功能与应用初步 1、应用程序类的继承关系示意图,2、类的命名规则 class Name=C+projectName+classType,3、 classWizard的功能 创建新类 把消息映射为类的成员函数 新建或删除消息处理函数 察看已被处理的消息并跳到消息处理代码处 定义成员变量 创建新类时,自动加入方法和属性 处理现有的类和类库,4、 classWizard的应用 实例:编写一个SDI程序框架,并实现在视图区以信息对话框的形式显示用户点击鼠标左、右键和次数。 为视图类添加m_nLeft、m_nRight两个私有型变量,并在构造函数中对其初始化; 利用类向导
3、在视图类中为鼠标左右单击操作添加“消息处理函数”OnLButtonDown()和OnRButtonDown(); 为OnLButtonDown()函数添加功能代码,右键函数与此类似 m_nLeft+; CString strOutput; strOutput.Format(“鼠标左键单击的次数为:%d”, m_nLeft); MessageBox (strOutput); 编译、链接并运行程序,测试程序效果。,2、MFC的文档/视图结构 采用分离机制将数据的管理和显示分作两部分,数据管理和维护由文档负责,数据的显示和编辑由视图负责。,文档/视图结构是MFC的一大特色:把数据处理类从用户界面处理
4、类中分离出来,使每一个类专门完成指定的任务。 APP向导已经设计好了两者间的相互关系,程序员只要把主要精力放在具体的数据结构设计和数据显示操作上即可。,3、文档/视图的相互作用函数 (1)视图类的GetDocument()函数 (2)文档类的UpdateAllViews()函数 (3)视图类的OnUpdate()函数,支持文档/视图相互作用的函数还有: OnInitialUpdate() OnNewDocument() 实际上,刷新视图的一般过程是:CDocument:UpdateAllViews() CView:OnUpdate() CView:Invalidate() OnPaint()
5、OnDraw(),4、多文档 MFC多文档应用程序与单文档程序的根本差别 MDI窗口类的派生关系如下: CMDIFrameWnd:CMainFrame主框架窗口类; CMDIChildWnd:CChildFrame子框架窗口类; 文档模板描述了对应于每一种类型文档的视图和窗口的类型,由其来确立文档、视图、框架和各种资源之间的固定关系。,SDI和MDI文档模板的样式: 文档模板是在APP类的初始化函数InitInstance()中声明。 CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( /单文档模板
6、IDR_MAINFRAME, /主框架资源的ID RUNTIME_CLASS(CMySDIDoc), /SDI文档类 RUNTIME_CLASS(CMainFrame), / SDI主框架窗口类 RUNTIME_CLASS(CMySDIView); /SDI视图类 AddDocTemplate(pDocTemplate); / CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate( IDR_MYMDITYPE, /子框架窗口资源ID RUNTIME_CLASS(CMyMDIDoc), RUNTIME_CLAS
7、S(CChildFrame), / MDI子框架窗口类 RUNTIME_CLASS(CMyMDIView); AddDocTemplate(pDocTemplate);,五、菜单设计及应用 1、建立菜单资源 实例:创建一个名为DrawCoin的SDI项目,添加“画硬币”主菜单,并增加两个菜单项“增加硬币”、 “减少硬币”。 编程: (1)添加顶层菜单“画硬币(&C)” (2)增加两个菜单项(Menu Item) ID_COIN_ADD 增加硬币(&A)tCtrl+A 在客户区增加一枚硬币n增币 ID_COIN_SUB 减少硬币(&S)tCtrl+S 在客户区减少一枚硬币n减币,2、添加菜单命令
8、的处理函数 菜单实则一系列命令的列表,当某一菜单项被点击后,一个含有该菜单项ID标识的WM_COMMAND命令消息将发送给APP窗口,APP将该消息转换为一个“命令消息处理函数”的函数调用,从而响应命令。 利用“类向导”(Ctrl+W)工具为菜单添加消息映射函数,并添加用户代码:,本例中,为了实现菜单的操作功能,还必须完成如下三步: (1)为文档类添加一个名为m_nCoins的公有型整型变量; (2)利用类向导工具为文档类添加名为“DeleteContents”的消息处理函数,并在其内对m_nCoins=1初始化 。该函数在用户重新使用一个文档时自动调用。 (3)修改视图类的OnDraw()函
9、数,根据文档类保存的m_nCoins当前值画出指定数量的硬币 for (int i=0;im_nCoins;i+) int y=200-10*i; pDC-Ellipse(200,y,300,y-30); pDC-Ellipse(200,y-10,300,y-35); /用两个上下偏移椭圆表示硬币 ,UPDATE_COMMAND_UI是“更新用户界面命令消息”:它能够根据程序当前运行状态来动态设置菜单项的状态(可用或不可用)。 在程序刚运行时,将菜单项“减少硬币” 置为“不可用”(灰显状态)。需要在其UPDATE_COMMAND_UI消息映射函数中,添加代码: if (m_nCoinsEnab
10、le(FALSE); /禁用菜单项(灰显) else pCmdUI-Enable(TRUE); /使能菜单项(正常显示),3、为菜单命令设置加速键 在资源视图Accelerator中IDR_MAINFRAME项的加速键列表最后一空行操作。,4、为新菜单添加“弹出式快捷菜单” 利用类向导为视图类添加WM_CONTEXTMENU消息处理函数,并添加如下代码: CMenu menuPopup; /声明菜单对象 if (menuPopup.CreatePopupMenu() /创建菜单 menuPopup.AppendMenu(MF_STRING,ID_COIN_ADD,”增加硬币tCtrl+A”);
11、 /向菜单中添加菜单项 menuPopup.AppendMenu(MF_STRING,ID_COIN_SUB,”减少硬币tCtrl+M”); /向菜单中添加菜单项 /显示弹出式菜单,并对用户选择做出响应 menuPopup.TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this); ,六、鼠标消息的处理 1、鼠标消息的类型 WM_MOUSEMOVE(移动); WM_LBUTTONDBLCLK(双击左键); WM_LBUTTONDOWN(按下左键); WM_LBUTTONUP(释放左键); WM_RBUTTONDOWN(按下右键); WM_RBUTTO
12、NUP(释放右键); (1)客户区鼠标消息(最常见) (2)非客户区鼠标消息(相对少见),2、鼠标消息的应用举例 实例:编写一个SDI程序MyDraw,程序运行后,当用户在客户区内按下鼠标左键并移动时,会沿鼠标移动轨迹自动绘制出连续的线段。 分析:本例属典型的“客户区鼠标消息”的应用。 编程实现:(具体步骤及代码详见MyDraw.txt文件),七、工具栏与状态栏设计 1、添加工具栏按钮的方法 工具栏是由形象化的位图按钮所组成,它结合了菜单和快捷键的共同优点,具有操作直观快捷,使用方便的特点。 工具栏内的按钮一般都与某一特定的菜单命令相对应,从功能上讲,它与特定菜单命令一致。 在具体编程实现上,
13、程序员应当先利用资源视图设计出新按钮图形图标,后将其ID值设置成与对应菜单项ID相同即可。 实例:为前述的DrawCoins程序的工具栏添加两个对应按钮.,2、添加用户自定义工具栏的方法 添加用户自定义工具栏步骤: (1)在工程中插入新工具条资源, 并添加相关按钮; (2)在CMainFrame类头文件中加入:CToolBar my_ToolBar; (3)在MainFrame.cpp文件的Create()函数中模仿生成标准工具栏的方法, 书写生成新工具栏的语句, 并在最后“停泊工具栏”的函数中加入第2个参数AFX_IDW_DOCKBAR_LEFT; (4)为工具条的各个按钮添加UPDATE_
14、COMMAND_UI和COMMAND类型的消息映射,并添加实现代码; (5)在”查看”菜单中为新工具条的添加控制菜单命令;在消息映射处理函数中以 IsWindowVisible()函数为判断条件,以ShowWindow()函数的SW_HIDE或SW_SHOW参数控制,以决定其显隐。,实例:为MyDraw画线程序添加“画笔选择”工具栏(该例以另一种方式实现工具栏按钮的基本功能). (1)在视图类中头文件中手工添加工具条的消息映射函数的声明: afx_msg void OnPenChioce(UINT nID); (2)在实现文件中加入消息映射宏: ON_COMMAND_RANGE(ID_PEN_
15、RED,ID_PEN_WIDTH,OnPenChioce) (3)在实现文件中加入消息处理函数的定义: void CMyDrawView:OnPenChioce(UINT nID) switch(nID) /以下case语句分别对应于画笔工具条自左向右的各个按钮控件 case ID_PEN_RED:m_colors=RGB(255,0,0); break; /红笔取色 case ID_PEN_SOLID:PenStyle=PS_SOLID; break; /设置画笔风格为实线 case ID_PEN_WIDTH:PenWidthDlg();break;/调用自定义函数获取笔粗数据 defaul
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 第三 MFC 框架 文档 视图
链接地址:https://www.31doc.com/p-3486195.html