转载自:http://hi.baidu.com/lovewjlove/blog/item/592922c7c3b0d5d5d0006018.html
要通过滚动条显示文档,必须知道文档滚动到了什么位置;一旦用户拖动滚动条时要告诉视图改变在文档中的位置。所有这些,由MFC的CSrollView类来完成。而程序员要做的工作是:
1、从CScrollView类中派生自己的视图类,以支持滚动条;
2、提供文档大小,确定滚定范围和设置初始值;
3、协调文档位置和屏幕坐标。
一、由CScrollView类派生视图类
使用AppWizard创建应用程序框架时,在第6步时,可以选择CScrollView类作为视图类的基类。另外在程序中也可以手工设置:
在视图类 *view的头文件和资源文件中,搜索CView,将其替换为CScrollView即可。
二、确定滚动的范围,设置初始值
滚动窗口创建时,必须设置客户窗口的总尺寸。使用CWnd成员函数SetScrollSizes()可以设置滚动窗口的尺寸。该操作必须在客户窗口创建前完成,因此需要重载视图类的On
void CCh10Demo3View::On
{
CScrollView::On
SIZE size={3000,1500};
SetScrollSizes(MM_TEXT,size); // 滚动窗口的最大区域设置
}
三、协调文档位置与屏幕坐标
在Windows中,文档坐标系成为逻辑坐标系,视图坐标系成为设备坐标系。在视图滚动后,如果用户在视图中单击坐标,那么会得到鼠标位置的设备(视图)坐标。在使用这一个数据处理文档(如点线)时,需要把它转化为文档坐标。当调用MFC绘图函数绘图时,Windows自动将文档转化为视图坐标,然后再绘图。
CDC提供了了两个成员函数LPToDP()和DPToLP()完成设备坐标和逻辑坐标之间的转换工作。对于本例而言,在鼠标消息响应函数中,其获取的坐标是设备坐标,因此需要使用DPTOLP()转为文档坐标。而在On
另外,视图坐标和文档坐标还存在原点的匹配问题。如果视图的滚动条没有滚动则原点是重合的,如果滚动了则不一致,这就需要我们调整视图坐标。
CScrollView视图类提供了一个函CScrollView::On
CClientDC dc(this);//获取客户窗口DC
On
dc.DPtoLP(&point);//将视图坐标转换为文档坐标