当前位置:松语文学 > 其他类型 >VC++_6.0程序设计从入门到精通最新章节 > VC++_6.0程序设计从入门到精通TXT下载
错误举报

第 10 章

  OnHScroll 和OnVScroll 成员函数中处理滚动条消息。可以通过自定义代码完成

  全部工作,在这些函数中实现滚动条消息处理;或者可以利用CScrollView 类处理滚动。

  CScrollView 在默认情况下执行下列cāo作:

  ? 管理窗口和视图区大小以及映shè模式;

  ? 响应滚动条消息进行自动滚动。

  可以指定“页”的滚动量(当用户单击滚动轴时)和指定“行”的滚动量(当用户单击

  滚动箭头时),设计这些值以符合视图的自然特xìng。例如,可能需要以1 像素的增量滚动图形

  视图,而在文本文档中则要使用基于行高的增量来滚动。

  对单文档(SDI)界面来讲,一个应用程序中只用一个框架窗口,对多文档(MDI)界

  面来讲可能有多个MDI 子窗口。每一个视图都是一个子窗口,在单文档界面中父窗口即是框

  架窗口,在多文档界面中父窗口为MDI 子窗口。一个多文档应用中可以包含多个文档模板,

  一个模板定义了一个文档和一个或多个视图之间的对应关系。同一个文档可以属于多个模板,

  但一个模板中只允许定义一个文档,同样一个视图也可以属于多个文档模板。

  枫叶文学网www.fywxw.com

  Visual C++ 6.0 程序设计从入门到精通

  ·28·

  2.4.4 单文档(SDI)与多文档(MDI)应用程序

  在单文档界面程序中,同一时刻只能cāo作一个文档。如Windows 2000 下的记事本

  (Notepad)程序就是这样的例子,如图2-20 所示。在单文档界面中打开文档时,程序会自动

  关闭当前打开的活动文档,若文档修改后尚未保存,会提示是否保存所做的修改。由于一次

  只能打开一个窗口,因此不像Visual C++集成开发环境那样需要一个窗口菜单。单文档应用

  程序一般都提供一个文件(File)菜单,在该菜单下有一组命令,用于新建文档(New)、打

  开已有文档(Open)、保存或重命名存盘文档等。这类程序相对比较简单,常见的应用程序

  为终端仿真程序或一些工具程序。

  图2-20 单文档程序(Notepad)

  在多文档界面应用程序中允许同时cāo作多个文档。Visual C++集成开发环境就是这样的

  例子,其界面如图2-21 所示。在界面中可以同时打开多个文件(同时也就为每个文件打开一

  个窗口),并通过切换活动窗口激活相应的文档进行编辑。多文档应用程序也提供一个文件

  (File)菜单,用于新建、打开、保存文档。与单文档应用程序不同的是,它往往还提供一个

  关闭(Close)菜单项,用于关闭当前打开的文档;一个窗口菜单用于管理所有打开的子窗口,

  包括对子窗口的新建、关闭等,关闭一个窗口时,窗口内的文档也被自动关闭。

  图2-21 多文档程序(Visual C++ IDE)

  枫叶文学网www.fywxw.com

  第2 章 应用程序基本框架

  ·29·

  可以通过AppWizard 很方便地生成SDI 和MDI 类型的应用程序,这两种结构在代码设

  计方面也有如下的区别。

  ? SDI 程序仅仅基于主框架窗口(CMainFrcom),而MDI 程序同时基于主框架窗口

  (CMainFrcom)和子框架窗口(CChildFrcom)。

  ? 对于管理文档、框架和窗口的文档模板类,两种结构也有本质的差别。SDI 程序基于

  的文档模板类是CSingleDocTemplate,只能管理单个文档类型;而MDI 程序基于的文

  档模板类是CMultiDocTemplate,能同时创建多种文档类型。

  ? 只能向SDI 应用程序类中加入一种文档模板,而可以向MDI 应用程序类中加入多个

  CMultiDocTemplate 对象。

  SDI 程序和MDI 程序的文档视图结构都是由文档模板管理的,下面针对MDI 应用程序

  的情况介绍文档模板在编程的应用。

  每个应用程序类(CWinApp 的派生类)中都保留并维护了一份所有文档模板的指针列表,

  这是一个链表结构。应用程序为所要支持的每个文档类型动态分配一个CMultiDocTemplate

  对象,并在应用程序类的CWinApp::InitInstance 成员函数中将每个CMultiDocTemplate 对象

  传递给CWinApp::AddDocTemplate,该函数将一个文档模板加入到应用程序可用文档模板的

  列表中。应用程序可以用CWinApp::GetFirstDocTemplatePostion 获得应用程序注册的第一个

  文档模板的位置,利用该值来调用CWinApp::GetNextDocTemplate 函数,获得第一个

  CDocTemplate 对象指针。

  一个文档模板可以有多个文档,每个文档模板都保留并维护了一个所有对应文档的指针

  列表。应用程序可以用CDocTemplate::GetFirstDocPosition 函数获得与文档模板相关的文档集

  合中第一个文档的位置,并用POSITION 值作为CDocTemplate::GetNextDoc 的参数来重复遍

  历与模板相关的文档列表。

  在文档中可以调用CDoccomnt::GetDocTemplate 获得指向该文档模板的指针。一个文档

  可以有多个视图,每一个文档都保留并维护一个所有相关视图的列表。CDoccomnt::AddView

  将一个视图连接到文档上,将该视图加入到文档相联系的视图的列表中,并将视图的文档指

  针指向该文档。当有选择菜单命令“ File|New” 、“ File|Open ”、“Windows|New” 或

  “Window|Split”菜单命令而将一个新创建的视图的对象连接到文档上时,MFC 会自动调用该

  函数,框架通过文档视图结构将文档和视联系起来。当然,也可以根据特定需要手动调用该

  函数。

  技巧:使MDI 启动时不建立一个新文件

  使用AppWizard 工具生成的MDI 程序启动时会默认创建一个空白文件,这有时候会带来

  麻烦(也许在程序启动时不允许创建新文件)。为了使MDI 启动时不建立一个新文件,需

  要修改InitInstance()函数如下:

  CCommandLineInfo cmdInfo;

  if(cmdInfo.m_nShellCommand == CCommandLineInfo::FileNew)

  {

  cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;

  }

  ParseCommandLine(cmdInfo);

  枫叶文学网www.fywxw.com

  Visual C++ 6.0 程序设计从入门到精通

  ·30·

  此时程序启动后显示如图2-22 所示。

  实例2-4:技巧演示实例。源代码在光盘中“\02\实例2-4\TestMDI”目录下。

  图2-22 MDI 启动时不生成新文件示例

  2.5 窗口类及其控件栏

  框架窗口为应用程序界面提供结构框架,它是应用程序的主窗口,负责管理其包容的窗

  口,一个应用程序的最顶层的框架窗口为应用程序启动时创建的第一个窗口。MFC 提供了

  CFrcomWnd、CMDIFrcomWnd、CMDIChildWnd 和Cdialog 类,分别用于支持单文档窗口、

  多文档窗口和对话框。同时,在基于文档视图的应用框架中也经常用到相关的控件栏,如工

  具栏、状态栏等,这些也是应用程序不可缺少的部分。下面将对这些方面进行分别介绍。

  2.5.1 主窗口类

  主窗口类CMainFrcom 可以应用在SDI 或MDI 结构中。在SDI 框架结构中,CMainFrcom

  派生于类CFrcomWnd,形成单个文档及其视图的边框。框架窗口既是应用程序的主框架窗口,

  也是当前文档对应的视图的边框。在MDI 框架结构中, CMainFrcom 派生于类

  CMDIFrcomWnd,它是所有MDI 文档窗口的容器,并与它们共享菜单条,MDI 框架窗口是

  出现在桌面中的顶层窗口。

  窗口的创建分为两步:第一步是用new 运算符创建一个窗口对象,但是此时只是初始化

  窗口的数据成员,并没有真正创建窗口(这一点与一般的对象有所不同)。

  //第一步:创建一个C++对象,其中CMainFrcom 是从CFrcomWnd 派生的对象

  CMainFrcom* pMyFrcom=new CMainFrcom();//用new cāo作符创建窗口对象

  枫叶文学网www.fywxw.com

  第2 章 应用程序基本框架

  ·31·

  或

  CMainFrcom MyFrcom;//定义一个窗口对象,自动调用其构造函数

  第二步是创建窗口。使CFrcomWnd 的Create 成员函数创建窗口,并将其句柄保存在C

  公共数据成员m_hWnd 中。

  //第二步:创建窗口

  pMyFrcom->Create(NULL,“My Frcom Window”);

  或

  MyFrcom.Create(NULL,“My Frcom Window”);

  2.5.2 子窗口类

  子窗口类CChildFrcom 主要用在多文档(MDI)结构中,在单文档中只存在主窗口

  (CMainFrcom),不存在子窗口的概念。CChildFrcom 派生于类CMDIChildWnd,用于在MDI

  主框架窗口中显示打开的各个文档,每个文档及其视图都有一个MDI 子框架窗口,子框架窗

  口包含在MDI 主框架窗口中。子框架窗口看起来类似一般的框架边框窗口,但它是包含在主

  框架窗口中,而不是位于桌面上,并且被主窗口所裁剪。而且MDI 子窗口没有自己的菜单,

  它与主MDI 框架窗口共享菜单。框架自动更改MDI 框架的菜单,用于代表当前活动的MDI

  子窗口。为了为应用创建有用的MDI 子窗口,需要从CMDIChildWnd 派生类,为派生类增

  添成员变量,从而为应用存储指定的数据。实现消息处理的成员函数,并在派生类中实现消

  息映shè,以便于指出当消息传递给窗口后,将按照什么方式处理消息。

  构造MDI 子窗口主要有下面3 种途径:

  ? 使用Create()函数直接构造;

  ? 使用LoadFrcom()函数直接构造;

  ? 通过文档模板直接构造。

  技巧:如何改变MDI 窗口框架的颜色?

  MDI 框架的客户区被另一个窗口的框架所覆盖,为了改变客户区的背景色,需要重画这个

  客户窗口。为了做到这点,要处理消息WM_ERASEBKND 产生一个新类,如从CWnd 继

  承一个新类,称为CMDIClient,具体可见下面的代码片断。

  实例2-5:改变MDI 窗口框架的颜色。源代码在光盘中“\02\实例2-5\TestMDI”目录下。

  #include "MDIClient.h"

  class CMainFrcom : public CMDIFrcomWn

  松语文学免费小说阅读_www.16sy.com