框架窗口教学课件_第1页
框架窗口教学课件_第2页
框架窗口教学课件_第3页
框架窗口教学课件_第4页
框架窗口教学课件_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、6.1 框架窗口1.主框架窗口和文档窗口 主框架窗口是应用程序直接放置在桌面(DeskTop)上的那个窗口,每个应用程序只能有一个主框架窗口,主框架窗口的标题栏上往往显示应用程序的名称。 文档窗口对于单文档应用程序来说,它和主框架窗口是一致的,即主框架窗口就是文档窗口;而对于多文档应用程序,文档窗口是主框架窗口的子窗口。多文档应用程序的框架窗口16.1 框架窗口2. 窗口状态的改变参数值含 义SW_HIDE 隐藏此窗口并将激活状态移交给其它窗口SW_MINIMIZE将窗口最小化并激活系统中的顶层窗口SW_RESTORE激活并显示窗口。若窗口是最小或最大状态时,则恢复到原来的大小和位置。SW_S

2、HOW用当前的大小和位置激活并显示窗口SW_SHOWMAXIMIZED激活窗口并使之最大化SW_SHOWMINIMIZED 激活窗口并使之最小化SW_SHOWMINNOACTIVE窗口显示成为一个图标并保留其激活状态(即原来是激活的,仍然是激活)SW_SHOWNA用当前状态显示窗口SW_SHOWNOACTIVATE用最近的大小和位置状态显示窗口并保留其激活状态SW_SHOWNORMAL 激活并显示窗口 MFC AppWizard为每一个文档应用程序的框架窗口设置了相应的大小和位置,但默认的窗口状态有时并不那么令人满意,这时就需要对窗口状态进行适当的改变。 ShowWindow函数的参数值26.

3、1 框架窗口3. 窗口风格的设置风 格含 义WS_BORDER窗口含有边框WS_CAPTION窗口含有标题栏(它意味着还具有WS_BORDER风格),但它不能和 WS_DLGFRAME 组合WS_CHILD 创建子窗口,它不能和WS_POPUP组合WS_DISABLED窗口最初时是禁用的WS_DLGFRAME 窗口含有双边框,但没有标题WS_HSCROLL 窗口含有水平滚动条WS_MAXIMIZE 窗口最初时处于最大化WS_MAXIMIZEBOX 在窗口的标题栏上含有最大化按钮WS_MINIMIZE 窗口最初时处于最小化,它只和WS_OVERLAPPED组合WS_MINIMIZEBOX 在窗口

4、的标题栏上含有最小化按钮WS_OVERLAPPED 创建覆盖窗口,一个覆盖窗口通常有一个标题和边框WS_OVERLAPPEDWINDOW创建一含有WS_OVERLAPPED、WS_CAPTION、WS_SYSMENU、WS_THICKFRAME、WS_MINIMIZEBOX和WS_MAXIMIZEBOX风格的覆盖窗口WS_POPUP 创建一弹出窗口,它不能和WS_CHILD组合。只能用CreateEx函数指定WS_POPUPWINDOW 创建一含有WS_BORDER、WS_POPUP和WS_SYSMENU风格的弹出窗口。当WS_CAPTION和WS_POPUPWINDOW风格组合时才能使系统菜

5、单可见WS_SYSMENU 窗口的标题栏上含有系统菜单框,它仅用于含有标题栏的窗口WS_TABSTOP 用户可以用TAB键选择控件组中的下一个控件WS_THICKFRAME 窗口含有边框,并可调整窗口的大小WS_VISIBLE 窗口最初是可见的WS_VSCROLL 窗口含有垂直滚动条36.1 框架窗口2. 在MFC AppWizard中进行修改 选择“文件”“新建”菜单,在弹出的“新建”对话框中选择“工程”标签,选择MFC AppWizard(exe)的项目类型,指定项目工作文件夹位置,输入项目名Ex_SDI2,单击确定按钮。 (2) 在向导的第一步中,将应用程序类型选为“单个文档”。 “新建

6、”对话框46.1 框架窗口(3) 单击下一个按钮,出现向导的第二步对话框,在这里用户可以选择 程序中是否加入数据库的支持。 “Step 2”对话框56.1 框架窗口 (4) 单击下一个按钮,出现向导的第三步对话框,允许用户在程序中加入复合文档、自动化、ActiveX控件的支持。66.1 框架窗口 (5) 单击下一个按钮,出现向导的第四步对话框,对话框的前几项依次确定对浮动工具条、打印与预览以及通信网络等特性的支持。 76.1 框架窗口 (6)单击高级按钮,出现下图所示的对话框,分别用于文档模板字串资源内容和窗口风格的修改。86.1 框 架 窗 口 (7) 单击关闭按钮回到向导对话框,单击下一个

7、按钮,出现如下图所示的对话框。 96.1 框 架 窗 口 (8) 单击下一个按钮,出现对话框。在这里,用户可以对MFC AppWizard提供的默认类名、基类名、各个源文件名进行修改。106.1 框 架 窗 口3. 修改CREATESTRUCT结构当窗口创建之前,系统自动调用PreCreateWindow虚函数。在用MFC AppWizard创建文档应用程序结构时,MFC已为主窗口或文档窗口类自动重载了该虚函数。 BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs) / 新窗口不带有最大化按钮 cs.style &= WS_MAXIMIZEBOX;

8、 / 将窗口的大小设为1/3屏幕并居中 cs.cy = :GetSystemMetrics(SM_CYSCREEN) / 3; cs.cx = :GetSystemMetrics(SM_CXSCREEN) / 3; cs.y = (cs.cy * 3) - cs.cy) / 2; cs.x = (cs.cx * 3) - cs.cx) / 2; / 调用基类的PreCreateWindow函数 return CFrameWnd:PreCreateWindow(cs); 116.1 框 架 窗 口4. 使用ModifyStyle和ModifyStyleExCWnd类中的成员函数ModifySty

9、le和ModifyStyleEx也可用来更改窗口的风格,其中ModifyStyleEx还可更改窗口的扩展风格。 126.1 框 架 窗 口5. 改变窗口的大小和位置用CWnd类的成员函数SetWindowPos或MoveWindow可以改变窗口的大小和位置。SetWindowPos是一个非常有用的函数,它不仅可以改变窗口的大小、位置,而且还可以改变所有窗口在堆栈排列的次序(Z次序),这个次序是根据它们在屏幕出现的先后来确定的。 nFlags值含 义SWP_HIDEWINDOW隐藏窗口SWP_NOACTIVATE不激活窗口。如该标志没有被指定,则依赖pWndInsertAfter 参数SWP_N

10、OMOVE不改变当前的窗口位置(忽略x和y参数)SWP_NOOWNERZORDER不改变父窗口的Z次序SWP_NOREDRAW不重新绘制窗口SWP_NOSIZE不改变当前的窗口大小(忽略cx和cy参数)SWP_NOZORDER不改变当前的窗口Z次序(忽略pWndInsertAfter参数)SWP_SHOWWINDOW显示窗口136.2 文 档 模 板1. 文档模板类文档应用程序框架结构是在程序运行一开始构造的,在单文档应用程序(设项目名为Ex_SDI)的应用程序类InitInstance函数中,可以看到这样的代码: BOOL CEx_SDI2App:InitInstance() CSingle

11、DocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME, / 资源ID RUNTIME_CLASS(CEx_SDIDoc), / 文档类 RUNTIME_CLASS(CMainFrame), / 主框架窗口类 RUNTIME_CLASS(CEx_SDIView); / 视图类AddDocTemplate(pDocTemplate); return TRUE;146.2 文 档 模 板2. 文档模板字符串资源 在MFC AppWizard创建的应用程序资源中,许多资源标识符都是IDR_MAINF

12、RAME,这就意味着这些具有同名标识的资源将被框架自动加载到应用程序中。 IDR_MAINFRAME的子串串号用 途Ex_SDI2n0应用程序窗口标题n1文档根名。对多文档应用程序来说,若在文档窗口标题上显示“Sheet1”,则其中的Sheet就是文档根名。若该子串为空,则文档名为默认的“无标题”Ex_SDIn2新建文档的类型名。若有多个文档类型,则这个名称将出现在“新建”对话框中。n3通用对话框的文件过滤器正文n4通用对话框的文件扩展名ExSDI2.Documentn5在注册表中登记的文档类型标识Ex_SDI Documentn6在注册表中登记的文档类型名称156.2 文 档 模 板3. 使

13、用多个文档类型用MFC AppWizard(exe)创建一个默认的多文档应用程序项目Ex_MDIDemo。(2) 打开项目工作区窗口中String Table的资源项,双击该项下的String Table,打开字符串表资源。166.2 文 档 模 板 (3) 双击IDR_MAINFRAME列表项,弹出字符串属性对话框,将其标题修改为“多个文档类型实例”。(4) 双击IDR_EX_MDITYPE列表项,在字符串属性对话中,将其内容修改:(5) 拖动字符串表编辑器右边 的滚动块,直到出现最后一个字符串项,双击最后的空行,在字符串属性对话框中将ID设为 修改IDR_MAINFRAME字符串标题 添加

14、新的字符串项176.2 文 档 模 板 (6) 按快捷键Ctrl+W,打开MFC ClassWizard,单击Add Class按钮,从弹出的菜单中选择New,出现“New Class”对话框,在Name框中输入类名COtherDoc,在Base class组合框中选择基类CDocument。(7) 单击OK按钮,新的文档类COtherDoc就添加到Ex_MDIDemo项目中。 (8) 修改CEx_MDIDemoApp:InitInstance函数代码. (9) 在类CEx_MDIDemoApp源代码文件Ex_MDIDemo.cpp的开始处,添加包含前面创建的两个派生类的头文件. 添加新的文档

15、类COtherDoc186.2 文 档 模 板编译运行并测试。 多类型文档窗口显示文档类型新建对话框 文件打开对话框中的文件类型196.3.1 MFC文档读写机制1. 创建空文档文档应用程序运行到应用程序类的InitInstance函数时,它会在调用了AddDocTemplate函数之后,通过CWinApp: ProcessShellCommand间接调用CWinApp的另一个非常有用的成员函数On,并依次完成工作:2. 打开文档当MFC AppWizard创建文档应用程序时,它会自动将“文件(File)”菜单中的“打开(Open)”命令(ID号为ID_)映射到CWinApp的On成员函数。

16、3. 保存文档当MFC AppWizard创建应用程序时,它会自动将“文件(File)”菜单中的“保存(Save)”命令与文档类CDocument的On函数在内部关联起来,但用户在程序框架中看不到相应的代码。 206.3.1 MFC文档读写机制4. 关闭文档(1) 若文档内容已被修改,则弹出一个消息对话框,询问用户是否需要将文档保存。 (2) 调用CDocument:OnCloseDocument虚函数,关闭所有与该文档相关联的文档窗口及相应的视图,调用文档类CDocument的DeleteContents清除文档数据。5. 文档读写操作类 型描 述类 型描 述BYTE8位无符号整型WORD1

17、6位无符号整型LONG32位带符号整型DWORD32位无符号整型float单精度浮点double双精度浮点int带符号整型short带符号短整型char字符型unsigned无符号整型打开和保存文档时,系统都会自动调用Serialize函数。事实上,MFC AppWizard在创建文档应用程序框架时已在文档类中重载了Serialize函数,通过在该函数中添加代码可达到实现数据序列化的目的。 ar中可以使用运算符的数据类型211. 简单数组集合类的构造及元素的添加对简单数组集合类构造的方法都是一样的,均是使用各自的构造函数,它们的原型如下: CByteArray CByteArray( ); C

18、DWordArray CDWordArray( ); CObArray CObArray( ); CPtrArray CPtrArray( ); CStringArray CStringArray( ); CUIntArray CUIntArray( ); CWordArray CWordArray( ); 6.3.2. 使用简单数组集合类226.3.2. 使用简单数组集合类2. 访问简单数组集合类的元素在MFC中,既可以使用GetAt函数,也可使用“”操作符: / CObArray:operator 示例 CObArray array; CAge* pa; / CAge是一个用户类 arra

19、y.Add( new CAge( 21 ) ); / 添加一个元素 array.Add( new CAge( 40 ) ); / 再添加一个元素 pa = (CAge*)array0; / 获取元素0 ASSERT( *pa = CAge( 21 ) ); array0 = new CAge( 30 ); / 替换元素0; ASSERT( *(CAge*) array0 = CAge( 30 ) ); / CObArray:GetAt示例 CObArray array; array.Add( new CAge( 21 ) ); / 元素 0 array.Add( new CAge( 40 )

20、); / 元素 1 ASSERT( *(CAge*) array.GetAt( 0 ) = CAge( 21 ) ); 236.3.2. 使用简单数组集合类3. 删除简单数组集合类的元素(1) 使用函数GetSize和整数下标值访问简单数组集合类中的元素。(2) 若对象元素是在堆内存中创建的,则使用delete操作符删除每一个对象元素。(3) 调用函数RemoveAll删除简单数组集合类中的所有元素。 CObArray array;CAge* pa1;CAge* pa2; array.Add( pa1 = new CAge( 21 ) ); array.Add( pa2 = new CAge(

21、 40 ) ); ASSERT( array.GetSize() = 2 ); for (int i=0;iarray.GetSize();i+) delete array.GetAt(i); array.RemoveAll(); 下面代码过程是一个CObArray的删除示例: 246.3.3. 建立可序列化的类 使一个类可序列化的目的是使其具有CArchive的序列化功能,即可以在文档类中的Serialize函数中直接通过CArchive引用变量进行该类数据的读写操作。 在MFC中,一个可序列化的类必须是CObject的一个派生类,且在类声明中,需要包含DECLARE_SERIAL宏调用,而

22、在类的实现文件中包含IMPLEMENT_SERIAL宏调用,这个宏有三个参数:前两个参数分别表示类名和基类名,第三个参数表示应用程序的版本号。最后还需要重载Serialize函数,使该类的数据成员进行相关序列化操作。256.3.4. 文档序列化示例 添加用于学生基本信息记录输入的对话框对话框资源的复制 学生基本信息输入对话框266.3.4. 文档序列化示例2. 添加并处理菜单项 在Ex_StudentDoc.cpp文件的开始处,添加包含CStuInfoDlg类的头文件包含。 (2) 在菜单资源的主菜单中添加顶层菜单项“学生基本信息(&S)”,在该顶层菜单项中添加子菜单“添加(&A)”(ID_S

23、TUINFO_ADD)。(3) 用MFC ClassWizard为CEx_StudentDoc类添加处理菜单项ID_STUINFO_ADD的COMMAND 消息,并添加代码: void CEx_StudentDoc:OnStuinfoAdd() CStuInfoDlg dlg; if (dlg.DoModal() != IDOK) return; / 添加记录 CStudentInfo *pStudent = new CStudentInfo(dlg.m_strName, dlg.m_strNo, dlg.m_bMale, dlg.m_tBirth, dlg.m_strSpecial); m_

24、stuObArray.Add(pStudent); SetModifiedFlag(); / 设置文档更改标志 UpdateAllViews(NULL); / 更新视图276.3.4. 文档序列化示例3. 修改CEx_StudentDoc类代码在Ex_StudentDoc.h文件的class CEx_StudentDoc前面,添加包含CStudentInfo类的头文件。 (2) 为CEx_StudentDoc类添加下列成员变量:public: CObArray m_stuObArray; / 对象集合类对象(3) 为CEx_StudentDoc类添加成员函数CStudentInfo* GetS

25、tudentInfoAt(int nIndex),用来获取m_stuObArray中指定索引号的CStudentInfo类指针, 为CEx_StudentDoc类添加成员函数int GetAllRecNum(void),用于获取集合类中对象的个数其代码如下: int CEx_StudentDoc:GetAllRecNum() return m_stuObArray.GetSize();286.3.4. 文档序列化示例(5) 在CEx_StudentDoc类析构函数CEx_StudentDoc添加下列代码:CEx_StudentDoc:CEx_StudentDoc()int nIndex = G

26、etAllRecNum();while (nIndex-)delete m_stuObArray.GetAt(nIndex); / 删除并释放对象的内存空间m_stuObArray.RemoveAll(); (6) 在CEx_StudentDoc:Serialize函数中添加下列代码: void CEx_StudentDoc:Serialize(CArchive& ar) if (ar.IsStoring() m_stuObArray.Serialize(ar); else m_stuObArray.Serialize(ar);296.3.4. 文档序列化示例4. 修改CEx_StudentV

27、iew类代码 void CEx_StudentView:OnDraw(CDC* pDC) CEx_StudentDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); int y = 0; for (int nIndex = 0; nIndex GetAllRecNum(); nIndex+) pDoc-GetStudentInfoAt(nIndex)-Display(y, pDC); y += 16; 将CEx_StudentView:OnDraw代码修改,用来将所有的学生基本信息记录显示在视图中:306.3.4. 文档序列化示例 5. 修改文档的字串资

28、源 打开文档的字串资源IDR_MAINFRAME,将其内容修改为: 6. 编译运行并测试Ex_Student运行结果 Ex_StudentnStudentRecnEx_Stun记录文件(*.rec)n.recnExStudent.DocumentnEx_Stu Document316.3.5. 使用CFile类文件的打开和关闭 (1) 构造一个不带指定任何参数的CFile对象;(2) 调用成员函数Open并指定文件路径以及文件标志 方 式含 义C 表示创建一个新文件,若该文件已存在,则将文件原有内容清除。C 与C组合。若文件已存在,不会将文件原有内容清除。C 打开文件只读。C 打开文件读与写。

29、C 打开文件只写。C 防止子线程继承该文件。C 共享文件的读和写,若其他线程用相关方式打开过此文件,则件创建失败。C 禁止其他线程读此共享文件,若其他线程用相关方式打开过此文件,则创建失败。C 禁止其他线程写此共享文件,若其他线程用相关方式打开过此文件,则创建失败。C 禁止其他线程读写此共享文件,若其他线程用相关方式打开过此文件,即使是当前线程也会使创建失败。 CFile类的文件访问方式326.3.5. 使用CFile类2. 文件的读写和定位CFile 还支持获取文件状态,包括文件是否存在、创建与修改的日期和时间、逻辑大小和路径等。 rStatus用来存放文件状态信息,它是一个C结构类型,该结

30、构具有下列成员: CTime m_ctime 文件创建日期和时间 CTime m_mtime 文件最后一次修改日期和时间 CTime m_atime 文件最后一次访问日期和时间 LONG m_size 文件的逻辑大小字节数,就像DOS命令中DIR所显示的大小 BYTE m_attribute 文件属性 char m_szFullName_MAX_PATH 文件名3. C类之间的关联可以将一个外部磁盘文件和一个CArchive 对象关联起来。 336.4.1. 一般视图类的使用 MFC中的CView类及其它的派生类封装了视图的各种不同的功能,它们为用户实现最新的Windows特性提供了很大的便利

31、。 类 名功能描述CScrollView提供自动滚动或缩放功能CFormView提供可滚动的视,它由对话框模板创建,并具有和对话框一样的设计方法。CRecordView提供表单视图直接与ODBC记录集对象关联;和所有的表单视图一样,CRecordView也是基于对话框模板设计的。CDaoRecordView提供表单视图直接与DAO记录集对象关联;其它同CRecordView。CCtrlView是CEditView、CListView、CTreeView和CRichEditView的基类,它们提供的文档/视结构也适用于Windows 98(NT)中的新控件。CEditView提供包含编辑控件的视

32、;支持文本的编辑、查找、替换以及滚动功能。CRichEditView提供包含复合编辑控件的视;它除了CEditView功能外还支持字体、颜色、图表及OLE对象的嵌入等。CListView提供包含列表控件的视;它类似于Windows 98资源管理器的右侧窗口。CTreeView提供包含树状控件的视;它类似于Windows 98资源管理器的左侧窗口。 CView的派生类及其功能描述346.4.1. 一般视图类的使用1. CEditView类CEditView类对象是一种视图,像CEdit类一样,它也提供窗口编辑控制功能,可以用来执行简单文本操作,如打印、查找、替换、剪贴板的剪切、复制和粘贴等。 更

33、改CEx_EditView的基类 Ex_Edit运行结果356.4.1. 一般视图类的使用2. CRichEditView类CRichEditView类使用了复文本编辑控件,因此它支持混合字体格式和更大数据量的文本。CRichEditView类被设计成与CRichEditDoc和CRichEditCntrItem类一起使用,它们可实现一个完整的ActiveX包容器应用程序。3. CFormView类(1) 添加并设计表单“New Form”对话框添加表单后的开发环境 366.4.1. 一般视图类的使用(2) 完善代码并测试 Ex_Form运行结果Ex_Form最终运行结果 (3) CHtmlV

34、iew 类CHtmlView 类是在文档视图结构中提供WebBrowser控件的功能。 (4) CScrollView类 (5) 列表视图CScrollView类不仅能直接支持视图的滚动操作,而且还能管理视口的大小和映射模式,并能响应滚动条消息、键盘消息以及鼠标滚轮消息。列表视图类CListView按照MFC文档视图结构封装了列表控件CListCtrl的功能。 (6) 树视图376.4.2. 文档与视图的相互作用 CView:GetDocument函数视图对象只有一个与之相联系的文档对象,它所包含的GetDocument函数允许应用程序由视图得到与之相关联的文档。 2. CDocument:U

35、pdateAllViews函数如果文档中的数据发生了改变,那么所有的视图都必须被通知到,以便它们能够对所显示的数据进行相应的更新。 3. CView:OnUpdate函数这是一个虚函数。 4. CView:OnInitialUpdate函数当应用程序被启动时,或当用户从“文件”菜单中选择了“新建”或“打开”时,该CView虚函数都会被自动调用。 5. CDocument:OnNewDocument函数在文档应用程序中,当用户从“文件”菜单中选择“新建”命令时,框架将首先构造一个文档对象,然后调用该虚函数。 386.4.3. 应用程序对象指针的互调 从文档类中获取视图对象指针在文档类中有一个与其

36、关联的各视图对象的列表,并可通过CDocument类的成员函数GetFirstViewPosition和GetNextView来定位相应的视图对象。 void CMyDoc:OnRepaintAllViews() POSITION pos = GetFirstViewPosition(); while (pos != NULL) CView* pView = GetNextView(pos); pView-UpdateWindow(); / 实现上述功能也可直接调用 UpdateAllViews(NULL); 用CDocument:GetFirstViewPosition和GetNextVie

37、w重绘每个视图: 396.4.3. 应用程序对象指针的互调2. 从视图类中获取文档对象和主框架对象指针在视图类中获取文档对象指针是很容易的,只需调用视图类中的成员函数GetDocument即可。 3. 在主框架类中获取视图对象指针对于单文档应用程序来说,只需调用CFrameWnd类的GetActiveView成员函数即可 所在的类获取的对象指针调用的函数说 明文档类视图GetFirstViewPosition和GetNextView获取第一个和下一个视图的位置文档类文档模板GetDocTemplate获取文档模板对象指针视图类文档GetDocument获取文档对象指针视图类框架窗口GetPar

38、entFrame获取框架窗口对象指针框架窗口类视图GetActiveView获取当前活动的视图对象指针框架窗口类文档GetActiveDocument获得当前活动的文档对象指针MDI主框架类MDI子窗口MDIGetActive获得当前活动的MDI子窗口对象指针各种对象指针的互调方法406.4.4. 切 分 窗 口1. 静态切分和动态切分 对于“静态切分”窗口来说,当窗口第一次被创建时,窗格就已经被切分好了,窗格的次序和数目不能再被改变,但用户可以移动切分条来调整窗格的大小。 对于“动态切分”窗口来说,它允许用户在任何时候对窗口进行切分,用户既可以通过选择菜单项来对窗口进行切分,也可以通过拖动滚

39、动条中的切分块对窗口进行切分。 2. 切分窗口的CSplitterWnd类操作 BOOL Create( CWnd* pParentWnd, int nMaxRows, int nMaxCols, SIZE sizeMin, CCreateContext* pContext, DWORD dwStyle = WS_CHILD | WS_VISIBLE |WS_HSCROLL | WS_VSCROLL | SPLS_DYNAMIC_SPLIT, UINT nID = AFX_IDW_PANE_FIRST );BOOL CreateStatic( CWnd* pParentWnd, int nRo

40、ws, int nCols, DWORD dwStyle = WS_CHILD | WS_VISIBLE, UINT nID = AFX_IDW_PANE_FIRST );函数原型: 416.4.4. 切 分 窗 口3. 静态切分窗口简单示例 (1) 用MFC AppWizard(exe)创建一个单文档应用程序Ex_SplitSDI。 (2) 打开框架窗口类MainFrm.h头文件,为CMainFrame类添加一个保护型的切分窗口的数据成员.(3) 用MFC ClassWizard创建一个新的视图类CDemoView(基类为CView)用于与静态切分的窗格相关联。(4) 用MFC ClassW

41、izard为CMainFrame类添加OnCreateClient(当主框架窗口客户区创建的时候自动调用该函数)函数重载. (5) 在MainFrm.cpp源文件的开始处,添加视图类CDemoView的包含文件:(6) 编译并运行。 #include DemoView.h426.4.4. 切 分 窗 口4. 动态切分窗口简单示例用MFC AppWizard(exe)创建一个默认的单文档应用程序Ex_DySplit。 (2) 选择“工程”“添加工程”“Components and Controls”,弹出对话框。(3) 双击“Visual C+ Components”,出现Visual C+支持

42、的组件,选中Splitter Bar。单文档应用程序的动态切分Visual C+支持的组件436.4.4. 切 分 窗 口 (4) 单击Insert按钮,出现一个消息对话框,询问是否要插入Splitter Bar组件,单击确定按钮,弹出对话框。 (5) 选中Both选项,单击OK按钮,回到上图对话框,单击结束按钮,动态切分就被添加到单文档应用程序的主框架窗口类CMainFrame中。 (6) 编译运行,结果如图所示。 Splitter Bar组件选项对话框 Ex_DySplit运行结果446.4.5. 一 档 多 视MFC对于“一档多视”提供下列三个模式: 在各自MDI文档窗口中包含同一个视图

43、类的多个视图对象。(2) 在同一个文档窗口中包含同一个视图类的多个视图对象。(3) 在单独一个文档窗口中包含不同视图类的多个视图对象。 Ex_Rect运行结果456.4.5. 一 档 多 视1.设计并完善切分窗口左边的表单视图(1) 用MFC AppWizard(exe)创建一个多文档应用程序Ex_Rect。 (2) 打开表单模板资源IDD_EX_RECT_FORM,调整表单模板大小,并依 次添加控件。添加的控件ID号标 题其他属性编辑框IDC_EDIT1默认旋转按钮IDC_SPIN1自动伙伴(Auto buddy)、Set buddy integer, Alignment Right,其余默

44、认编辑框IDC_EDIT2默认旋转按钮IDC_SPIN2自动伙伴(Auto buddy)、Set buddy integer, Alignment Right,其余默认添 加 的 控 件466.4.5. 一 档 多 视 (3) 打开MFC ClassWizard的Member Variables标签,在Class name中选择CEx_RectView,选中所需的控件ID号,双击鼠标,依次为下列控件添加成员变量,如表所示。(4) 在CEx_RectDoc类中添加一个公有型的CPoint数据成员m_ptRect,用来记录小方块的位置。控件ID号变量类别变量类型变量名IDC_EDIT1Valuei

45、ntm_CoorXIDC_EDIT2Valueintm_CoorYIDC_SPIN1ControlCSpinButtonCtrlm_SpinXIDC_SPIN2ControlCSpinButtonCtrlm_SpinY控 件 变 量476.4.5. 一 档 多 视(5) 在CEx_RectDoc类的构造函数处添加下列代码: CEx_RectDoc:CEx_RectDoc() m_ptRect.x = m_ptRect.y = 0;/ 或m_ptRect = CPoint(0,0)(6) 用MFC ClassWizard为编辑框IDC_EDIT1和IDC_EDIT2添加EN_CHANGE的消息映

46、射,使它们的映射函数名都设为OnChangeEdit,并添加下列代码: void CEx_RectView:OnChangeEdit() UpdateData(TRUE); CEx_RectDoc* pDoc = (CEx_RectDoc*)GetDocument(); pDoc-m_ptRect.x = m_CoorX; pDoc-m_ptRect.y = m_CoorY; CPoint pt(m_CoorX, m_CoorY); pDoc-UpdateAllViews(NULL, 2, (CObject *)&pt);486.4.5. 一 档 多 视(7) 用MFC ClassWizard

47、为CEx_RectView添加OnUpdate的消息函数,并添加下列代码:void CEx_RectView:OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) if (lHint = 1)CPoint* pPoint = (CPoint *)pHint;m_CoorX = pPoint-x;m_CoorY = pPoint-y;UpdateData(FALSE);/ 在控件中显示CEx_RectDoc* pDoc = (CEx_RectDoc*)GetDocument();pDoc-m_ptRect = *pPoint;/ 保存在文档

48、类中的 m_ptRect496.4.5. 一 档 多 视(8) 在CEx_RectView:OnInitialUpdate中添加一些初始化代码: void CEx_RectView:OnInitialUpdate() CFormView:OnInitialUpdate(); ResizeParentToFit(); CEx_RectDoc* pDoc = (CEx_RectDoc*)GetDocument(); m_CoorX = pDoc-m_ptRect.x;m_CoorY = pDoc-m_ptRect.y; m_SpinX.SetRange(0, 1024); m_SpinY.SetR

49、ange(0, 768); UpdateData(FALSE); 506.4.5. 一 档 多 视(9) 这时编译并运行程序,程序会出现一个运行错误 (10) 为CEx_RectView添加一个BOOL型的成员变量m_bEditOK。(11) 在CEx_RectView构造函数中将m_bEditOK的初值设为FALSE。(12) 在CEx_RectView:OnInitialUpdate函数的最后将m_bEditOK置为TRUE,如下面的代码: void CEx_RectView:OnInitialUpdate() UpdateData(FALSE); m_bEditOK = TRUE;(13

50、) CEx_RectView:OnChangeEdit函数的最前面添加语句:516.4.5. 一 档 多 视BOOL CChildFrame:OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) CRect rect;GetWindowRect( &rect );BOOL bRes = m_wndSplitter.CreateStatic(this, 1, 2);/ 创建2个水平静态窗格m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CEx_RectView), CSize(0,0),

51、pContext);m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CDrawView), CSize(0,0), pContext); m_wndSplitter.SetColumnInfo(0, rect.Width()/2, 10);/ 设置列宽 m_wndSplitter.SetColumnInfo(1, rect.Width()/2, 10); m_wndSplitter.RecalcLayout();/ 重新布局return bRes;/CMDIChildWnd:OnCreateClient(lpcs, pContext);2. 添加视图类并创建切分窗口用MFC ClassWizard为添加一个新的CView的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论