1、Visual C+与面向与面向对对象程序象程序设计设计教程教程第第16章章 多文档界面程序多文档界面程序 计计计计算机教学算机教学算机教学算机教学实验实验实验实验中心中心中心中心西安交通大学西安交通大学西安交通大学西安交通大学教学目教学目标标n多文档界面(多文档界面(MDI)程序的构造和)程序的构造和编编程方法程方法 学学习习要求要求n理解多文档界面(理解多文档界面(MDI)程序的构造、主要)程序的构造、主要类类n掌握多文档界面(掌握多文档界面(MDI)编编程方法程方法 授授 课课 内内 容容n16.1 MDI应应用程序用程序 n16.2 滚动视图滚动视图 n调试调试技技术术 n程序程序设计举
2、设计举例例 16.1 MDI应应用程序用程序nMDI应应用程序必用程序必须须有一个有一个CMDIFrameWnd或其派或其派生生类类的的对对象,象,该该窗口称作窗口称作MDI框架窗口框架窗口 nMDI子窗口是子窗口是CMDIChildWnd或其派生或其派生类对类对象象 AppWizard为为MDI程序框架程序框架创创建了以下建了以下类类 类类 说说 明明CAboutDlg“关于关于”对话对话框框CChildFrame子框架窗口用于容子框架窗口用于容纳视图纳视图CMyApp应应用程序用程序类类CMyDoc文档文档类类CMyView视图类视图类CMainFrame框架窗口框架窗口(用来容用来容纳纳
3、子窗子窗口),是口),是MDI应应用程序的主窗口用程序的主窗口 例例16-1 绘图绘图程序程序 n用用户户可以鼠可以鼠标标“拖曳拖曳”方式在方式在视图视图中画直中画直线线段,段,线线的粗的粗细细和和颜颜色可色可调调。n采用采用MDI结结构,可同构,可同时时打开多个子窗口作打开多个子窗口作图图n所作所作图图形可以文件形式保存在磁形可以文件形式保存在磁盘盘上上 文件文件扩扩展名(程序生成展名(程序生成时设时设定)定)n用用AppWizard生生成成一一个个MDI程程序序框框架架,在在第第4步步打打开开Advanced Options(高高级级选选项项)对对话话框框,在在Document Templ
4、ate Strings(文文 档档 模模 板板 字字 符符 串串)选选 项项 卡卡 中中 将将 File extension(文文件件扩扩展展名名)设设置置为为“pic”,即即该该程序的程序的图图形文件名后形文件名后缀为缀为“.pic”。主菜主菜单设单设置置IDCaption命令消息响命令消息响应应函数函数=ID_COLOR“颜颜色色”OnColor()()ID_WIDTH1“宽宽度度1”OnWidth1()()ID_WIDTH3“宽宽度度3”OnWidth3()()ID_WIDTH5“宽宽度度5”OnWidth5()()ID_WIDTH7“宽宽度度7”OnWidth7()()描述描述线线段的
5、段的类类(数据成(数据成员员)class CLine:public CObject public:CPointm_pointFrom;/线线段起点段起点CPointm_pointTo;/线线段段终终点点COLORREF m_colorLine;/线线段段颜颜色色intm_nWidth;/线线段段宽宽度度 描述描述线线段的段的类类(成(成员员函数)函数)CLine()CLine(POINT from,POINT to,COLORREF color,int width);CLine&operator=(CLine&line);void Serialize(CArchive&ar);void Dra
6、wLine(CDC*pDC);virtual CLine()DECLARE_SERIAL(CLine);文档文档类类n数据定数据定义义中,添加如下数据成中,添加如下数据成员员 public:CLine m_lineListMAX_LINES;intm_nCount;n初始化初始化void CMyDoc:DeleteContents()m_nCount=0;文档文档类类n序列化序列化void CMyDoc:Serialize(CArchive&ar)if(ar.IsStoring()ar m_nCount;for(int i=0;im_nCount;i+)m_lineListi.Serializ
7、e(ar);视图类视图类n数据定数据定义义(不需序列化的数据定(不需序列化的数据定义义在此)在此)public:COLORREF m_colorCurr;/当前当前颜颜色色intm_nCurrWidth;/当前当前线宽线宽BOOLm_bCaptured;/是否按下鼠是否按下鼠标标左左键键CPointm_pointFrom;/当前当前线线始端始端CPointm_pointTo;/当前当前线终线终端端 n初始化初始化视图类视图类n显显示示图图形形void CMyView:OnDraw(CDC*pDC)CMyDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);for(
8、int i=0;im_nCount;i+)pDoc-m_lineListi.DrawLine(pDC);视图类视图类l数据修改(鼠数据修改(鼠标标消息)消息)lDownlMovelUpUpdateAllViews(this);/MDI特殊用法l菜菜单单l菜菜单单界面更新界面更新16.2 滚动视图滚动视图 n滚动视图类滚动视图类CScrollViewn重要方法重要方法 lSetScrollSizes()l坐标转换调试调试技技术术 n使用使用AppWizard建立建立MDI程序框架程序框架 程序程序设计举设计举例例 n例例16-3 改写例改写例16-1的的绘图绘图程序,使之使用程序,使之使用滚动视
9、图滚动视图,同,同时选时选用合适的映射模式,使程序具有用合适的映射模式,使程序具有“所所见见即所得即所得”的打印的打印风风格格 主要修改(一)主要修改(一)void CMy1603View:OnInitialUpdate()CScrollView:OnInitialUpdate();SetScrollSizes(MM_TWIPS,CSize(11520,15120);void CMy1603View:OnPrepareDC(CDC*pDC,CPrintInfo*pInfo)pDC-SetMapMode(MM_TWIPS);CScrollView:OnPrepareDC(pDC,pInfo);主
10、要修改(二)主要修改(二)n坐坐标转换标转换void CMy1603View:OnLButtonDown(UINT nFlags,CPoint point)CScrollView:OnLButtonDown(nFlags,point);CClientDC dc(this);OnPrepareDC(&dc);dc.DPtoLP(&point);/物理坐物理坐标转换为逻辑标转换为逻辑坐坐标标m_pointFrom=m_pointTo=point;SetCapture();m_bCaptured=TRUE;上机上机练习题练习题n完完善善例例16-3的的绘绘图图程程序序,包包括括改改善善界界面面(如如设设计计专专用用图图标标,完完善善菜菜单单等等)、加加上上绘绘制制其其他他图图形形的的功功能等。能等。n将吹泡泡程序的将吹泡泡程序的结结构改构改为为MDI,并使用,并使用滚动视图滚动视图。结结束束语语n学好程序学好程序设计语设计语言的唯一途径是言的唯一途径是 上机上机练习练习。n你的你的编编程能力与你在程能力与你在计计算机上投入的算机上投入的时间时间成成 正比。正比。谢谢观看!