MFC让文档/视图结构程序支持滚动条

 

转载自:http://hi.baidu.com/lovewjlove/blog/item/592922c7c3b0d5d5d0006018.html

要通过滚动条显示文档,必须知道文档滚动到了什么位置;一旦用户拖动滚动条时要告诉视图改变在文档中的位置。所有这些,由MFC的CSrollView类来完成。而程序员要做的工作是:

1、从CScrollView类中派生自己的视图类,以支持滚动条;
2、提供文档大小,确定滚定范围和设置初始值;
3、协调文档位置和屏幕坐标。

一、由CScrollView类派生视图类

使用AppWizard创建应用程序框架时,在第6步时,可以选择CScrollView类作为视图类的基类。另外在程序中也可以手工设置:

在视图类 *view的头文件和资源文件中,搜索CView,将其替换为CScrollView即可。

二、确定滚动的范围,设置初始值

滚动窗口创建时,必须设置客户窗口的总尺寸。使用CWnd成员函数SetScrollSizes()可以设置滚动窗口的尺寸。该操作必须在客户窗口创建前完成,因此需要重载视图类的OnInitialUpdate()函数。如下代码:

void CCh10Demo3View::OnInitialUpdate()
{
    CScrollView::OnInitialUpdate();
    SIZE size={3000,1500};
    SetScrollSizes(MM_TEXT,size); // 滚动窗口的最大区域设置
}

三、协调文档位置与屏幕坐标

在Windows中,文档坐标系成为逻辑坐标系,视图坐标系成为设备坐标系。在视图滚动后,如果用户在视图中单击坐标,那么会得到鼠标位置的设备(视图)坐标。在使用这一个数据处理文档(如点线)时,需要把它转化为文档坐标。当调用MFC绘图函数绘图时,Windows自动将文档转化为视图坐标,然后再绘图。

CDC提供了了两个成员函数LPToDP()和DPToLP()完成设备坐标和逻辑坐标之间的转换工作。对于本例而言,在鼠标消息响应函数中,其获取的坐标是设备坐标,因此需要使用DPTOLP()转为文档坐标。而在OnDraw()函数中文档坐标转为视图坐标进行绘图是系统自动完成的。

另外,视图坐标和文档坐标还存在原点的匹配问题。如果视图的滚动条没有滚动则原点是重合的,如果滚动了则不一致,这就需要我们调整视图坐标。

CScrollView视图类提供了一个函CScrollView::OnPrepareDC()成员函数,完成视图设备上下文坐标原点的匹配。需要在鼠标及按键消息响应中添加如下代码:
    CClientDC dc(this);//获取客户窗口DC
    OnPrepareDC(&dc);//进行坐标原点的匹配
    dc.DPtoLP(&point);//将视图坐标转换为文档坐标

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值