11.3 窗口滚动功能的实现.txt

来自「网上第一本以TXT格式的VC++深入详解孙鑫的书.全文全以TXT格式,并每一章节」· 文本 代码 · 共 58 行

TXT
58
字号
11.3 窗口滚动功能的实现 

11 .3.1 CScrollView类
在利用 MFC AppWizard生成工程时,在创建向导的第 6步可以把视类的基类选择为 CScrollView (如
图 1 1.9所示〉。这样,视图窗口就具有滚动功能,当图形在窗口中不能完整显示时,可以通过拖
动滚动条来浏览整个窗口中的内容。 
图 1 1. 9在 AppWizard的第 6步修改视类的基类

但是这时 Graphic程序已经生成了,如果要为其增加窗口滚动的能力,可以手工将该程序的视类的
基类由 CView修改为 CScrollView,这需要修改源程序中几处内容。在 CGraphicView类头文件中只
有一处需要修改,即该类的定义处,将 CView修改为 CScrollView即可,让 CGraphic View类从后
者派生。修改后的代码如下所示: 
class CGraphicView : public CScrollView 
{ 
…... 
但在 CGraphicView类的源文件中有多处需要修改,为了避免遗漏,可以利用【 Edit'\Rep1ace】菜
单命令进行替换。这时会出现如图 1 1. 10所示的对话框,在 Find what和 Rep1ace with编辑框中
分别输入 CView和 CScroll View,并选中 "Match whole word only" 选工页,然后单击【Replace 
All】按钮。这样就将 GraphView.cpp文件中所有出现 CView的地方都替换为 CScrollView了。
图 1 1.1 0替换对话框

这时, Graphic程序能够成功编译和链接,但是运行时将会出现一个非法操作提示。
这是因为对滚动窗口来说,在初始创建时,需要进行一些设置,包括整个滚动窗口的大小,
以及当单击滚动条箭头时滚动条滚动的数值和单击滚动栏时滚动条滚动的数值。要进行这
些设置,需要调用 CScrollView类的成员函数: SetScrollSizes,该函数的声明形式如下所示 : 

void SetScrollSizes{ int nMapMode , SIZE sizeTotal , const SIZE& sizePage = sizeDefault , 
const S工 ZE& sizeLine = sizeDefault ); 
SetScrollSizes函数的作用是设置滚动窗口的大小,有四个参数,其中后面两个参数都
有默认值。 
. nMapMode 
指定映射模式,其取值可以是表 1 1. 1所列值之一。 
. sizeTotal 
设置滚动视图窗口总的尺寸。 
. sizePage 
设置响应鼠标单击滚动条的轴时水平和垂直方向滚动的量。 
. sizeLine 
设置响应鼠标单击滚动箭头时水平和垂直方向滚动的量。因为该函数的后两个参数都有默认值,所
以在调用时可以只为其传递前两个参数的值。根据前面的知识,可以断定应该在视类窗口创建之后
再调用 SetScrollSizes函数。这里,
可以为 CGraphicView类重载一个虚函数: OnInitialUpdate o该函数是在窗口完全创建完成之后第
一个调用的函数,也就是说,该函数在第一次调用 OnDraw函数之前调用。利用此特点,可以在此函
数中对窗口进行一些初始化工作,本例就是设置滚动窗口的初始尺寸。 OnlnitialUpdate函数的具
体代码如例 11-8所示。
例 11-8 

void CGraphicView : : OnInitialUpdate ( ) 
{ 
CScrollView: :OnInitialUpdate () ; 
// TODO: Add your specialized code here and/ or call the base class 
SetScrollSizes{MM_TEXT, CSize(800 , 600)); 
Build并运行 Graphic程序,这时可以看到程序窗口就多了两个滚动条 (如图 1 1.1 1所
示)。读者可以利用相应菜单在窗口中绘制一些图形,然后拖动液动条,将可以看到程序窗口具有了
滚动能力。 
图 1 1.1 1带有滚动能力的程序窗口 


⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?