教 案
2007 ~2008 学年第一学期
主 讲 教 师 | |
课 程 名 称 | 面向对象程序设计(VC++) |
课程类别 | 专业基础课 |
学时及学分 | 80、4 |
授 课 班 级 | |
使 用 教 材 | VC++的使用及面向对象软件工程实例分析 |
系(院、部) | |
教研室(实验室) | 计算机应用教研室 |
课 时 授 课 计 划
课次序号:
一、课 题: ch6 多文档编程
二、课 型:讲授
三、目的要求:
1、 理解多文档程序的结构,熟悉多文档窗口的特点。
2、 掌握多文档程序的设计方法。
3、 熟悉视图分割的方法和应用。
四、重点、难点:
重点:多文档程序的结构和设计方法。
难点:多文档程序中视图与文档的交互作用较难理解。
五、教学方法及手段:
案例式教学:设计目标、关键技术、结合实例讲解语法、总结。
六、参考资料:
《面向对象程序设计与VC++实践》 揣锦华编著,西安电子科技大学出版社,第11章
《C++面向对象程序设计》李涛编著,高等教育出版社,第9章
七、作业:
习题6.2 6.3 6.4 6.6
八、授课记录:
授课日期 | ||||
班 次 | ||||
九、授课效果分析:
十、教学进程(教学内容、教学环节及时间分配等)
1、 复习
多文档程序的框架结构:5个主要的类 比如,
创建多文档程序ex_mdi,包含的主要类有:CmainFrame Cex_mdiView Cex_mdiDoc
Cex_mdiApp CchildFrame
与单文档程序相比,多了一个子窗口类类CchildFrame
2、 导入课题
多文档程序可以运行用户同时打开和使用多个文档,比单文档程序更方便,比如Word、Excel等。
3、 教学内容
ch6.1 多文档程序的结构和多文档窗口特点
[通过实例分析]
例6-1:建立一个多文档应用程序,用户能打开多个文档,并能在多个文档中输入信息,并可以利用“保存/另存为”保存每个文档中输入的信息,也可以利用“打开”新建的子窗口显示文件的内容。
关键技术:
利用视图类的ONCHAR消息映射函数OnChar实现键盘输入;
利用文档的串行化实现数据的保存、文件的打开。
实现过程:
(1)建立单文档应用程序ex_mdi
(2)为文档类Cex_mdiDoc添加一个字符串变量,用于保存输入的字符串。
CString m_strText;
(3)在文档类Cex_mdiDoc的构造函数中初始化字符串变量。
m_strText.Empty(); //初始化字符串为空
(4)处理键盘输入:为视图类添加WM_CHAR消息映射函数OnChar(),在函数中添加“取得输入字符”代码:
pDoc->m_strText+=nChar;
Invalidate(); //强迫调用OnDraw()函数,更新视图
[运行:从键盘输入,但看不见输入的信息]
(5)在视图中显示输入的内容:在视图类的OnDraw()中添加输出代码。
pDC->TextOut(0,10,pDoc->m_strText);
[运行:在指定位置显示从键盘输入的内容。但是用“文件/保存”命令将内容保存到文件后,文件内容为空]
(6)实现文档磁盘存取(即串行化),通过重载文档类中的Serialize()函数实现: ar<
ar>>m_strText; //从磁盘读出文档
(7)运行:
在程序打开的第一个子窗口中输入“This is the first MDIChildWnd”,
利用“新建”创建第二个子窗口,输入“This is the second MDIChildWnd”,
激活第一个子窗口,保存内容text1.txt;激活第二个子窗口,保存内容text2.txt;
“打开”已有的文件text3.txt,并输入内容保存。察看文件内容的变化。
一、 多文档程序的结构:
(1) 程序中主要的类:
CmainFrame CchildFrame CEx_mdiView CEx_mdiDoc CEx_mdiApp
(2) 各类的功能:
CmainFrame 主框架窗口类,负责为视图提供框架(标题、窗口组件等),同时负责响应标准的窗口消息。
CchildFrame 子窗口类,用于容纳视图和文档。
CEx_mdiView 视图类,负责文档数据的显示和文档数据的修改操作。
CEx_mdiDoc 创建、读写磁盘文件。并更新视图。具体操作:
文档类的函数UpdateAllViews()实现更新所有相关的视图,该函数自动调用OnUpdate()函数对文档进行访问。
CEx_mdiApp 负责一个应用程序对象的创建、初始化、运行、退出和清理工作。在InitInstance()函数中利用文档模板创建文档。通过修改该函数,可以让应用程序支持多种类型的文档。
二、 窗口特点分析:
(1) 应用程序有一个MDI主框架窗口,包含MDI客户区(即MDICLIENT)和菜单、工具栏等控制框口。
(2) MDI客户窗口负责管理主框架窗口的客户区和子窗口的创建。每个主框架窗口仅有一个MDI客户窗口。
(3) 每打开一个文档,框架就自动为文档创建一个MDI子窗口。当关闭一个子窗口时,框架负责删除子窗口。
(4) 在任何时刻,最多只有一个子窗口是活动的(窗口标题颜色呈蓝色高亮显示)。即“激活”状态。
(5) 主框架窗口的菜单项随子窗口而改变。
Ch6.2 访问当前活动视图和活动文档的方法
在基于文档/视图结构的应用程序中,经常要访问当前活动视图和活动文档。具体方法总结如下:
一、SDI程序:
主框架窗口就是文档窗口。
1、取得活动视图:
在框架窗口类中:
CmyView* pView;
pView= GetActiveView();
在文档类中:
POSITION pos=GetFirstViewPosition(); //获取第一个视图的位置
pView=GetNextView(&pos);//获取指定位置的视图的指针并将视图位置移至下//一个位置
2、获取活动文档:
CmyDocument* pDoc;
pDoc= GetDocument(); //在视图类中获得文档指针
二、MDI程序:
1、在主框架类中获得视图对象指针 :
在多文档程序中,主框架窗口没有任何关联的视图对象,而是每个子窗口都有对应的文档和视图对象。因此,要获得活动视图对象指针, 必须先获得当前活动子窗口,然后获得与子窗口相关联的活动视图,即:
CMIDIFrameWnd *pFrame = (CMIDIFrameWnd *)AfxGetApp()->m_pMainWnd;
//获得活动子窗口
CMIDChildWnd *pChild= pFrame->MIDIGetActive();
注:此时,pChild就相当于单文档程序中的主框架窗口的指针,以后的操作就与单文档基本一样了,比如:
CmyView *p_View = (CmyView*)pChild->GetActiveView();//获得活动视图
CmyDocument* pDoc= pChild->GetDocument(); //获得活动文档
三、 多文档编程小结:
在文档类中定义存放数据的对象,并重载文档类的Serialize()函数;
在视图类中完成数据显示、输入等。
Ch6.3 视图分割
视图分割:将客户取的显示窗口分割成几个部分,每个部分又可以代表一个视图。
窗口分割的方法:静态分割和动态分割。
常用动态分割方法。动态切分窗口的各个窗格式用同一个视图类。
一、 视图分割方法之一:
在创建应用程序时,利用向导设置分割窗口风格。
具体实现:在第六步对话框中单击Advanced 按钮,在Advanced Options对话框中选择Windows Styles选项卡,选择Use Split Window复选框即可。
例6-2:创建一个动态切分窗口(2*2)的MDI应用程序,在视图窗口中显示“Hello!”。
实现过程:
(1) 创建动态切分窗口的MDI应用程序ex_mdi_split,在Advanced Options对话框中选择Use Split Window复选框。
(2) 修改视图类中的OnDraw()。
void CEx_mdi_splitView::OnDraw(CDC* pDC)
{ CEx_mdi_splitDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CRect rc;
GetClientRect(&rc);
pDC->TextOut(100,(rc.bottom-rc.top)/2, "Hello!");
}
运行:
(1)在“窗口”菜单中自动添加了一个菜单项“分隔”。单击“窗口”菜单中的“分隔”,便可以按照需要分割窗口。将一个文档显示在几个视图中。
应用:当需要按照文档中的一部分内容修改另一部分相关内容(而两部分内容相距较远,不能同时在一个视图中显示)时特别有用。
(2)关闭子窗口,观察主菜单有何变化?[菜单项少了]
分析程序:
察看CchildFrame类中的函数:
BOOL CChildFrame::OnCreateClient( LPCREATESTRUCT /*lpcs*/,
CCreateContext* pContext)
{
return m_wndSplitter.Create( this,
2, 2, // TODO: adjust the number of rows, columns
CSize( 10, 10 ), // TODO: adjust the minimum pane size
pContext );
}
其中,m_wndSplitter是CsplitterWnd类的对象,是该子窗口类的成员变量,分割视图默认为2行2列共4个窗口,可以修改为(2,1),再运行,察看结果有何变化?
二、 在应用程序中,通过添加Split Bar组件实现分割窗口功能
实现方法:举例说明
(1) 创建多文档程序ex_split,采用默认设置。
(2) 在应用程序中添加控件:
选择Project->Add to Project -> Components And Controls命令,弹出Components And Controls Gallery对话框。双击展开Visual C++ Components 项,选择Split Bars控件。
设置Split Bar 的属性,用于指定在水平、垂直还是两个方向都是用分割窗口功能。比如,选择水平分割,如下图:
(3) 察看子窗口类Childfrm.h中添加了如下代码:
CSplitterWnd m_wndSplitter;
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
问题:运行时,菜单“查看”和“窗口”中都没有添加“分隔”窗口的命令。不能切分窗口。
(4) 添加“分隔”菜单项,但是它的ID必须是:ID_WINDOW_SPLIT[可以通过下拉列表选择]。
运行:单击“窗口”菜单中的“分隔”,则实现窗口的切分。
三、 通过手动编程的方法实现:
(1)在框架窗口类(对单文档为主框架窗口,对多文档为子框架窗口)中声明一个CSplitterWnd类的成员变量m_wndSplitter
(2)使用ClassWizard为框架窗口类添加OnCreateClient函数
(3)在OnCreateClient函数中调用CSplitterWnd类的成员函数Create产生动态切分。
(4)为应用程序添加一个ID为ID_WINDOW_SPLIT的菜单项。
[课下练习]
视图分割小结:三种方法,本质是一样的,都是在子窗口框架类中添加一个CSplitterWnd类的成员变量m_wndSplitter,以及实现分割视图的成员函数OnCreateClient(),并在该函数中利用Create方法分割视图。
4、 课堂总结
多文档程序的结构、各个类的作用和关系,视图分割方法。
5、布置作业
习题 6.2 ,6.3,6.4 ,6.6
本文来源:https://www.2haoxitong.net/k/doc/3035dcde7f1922791688e833.html
文档为doc格式