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

来源:互联网 发布:java项目怎么发布 编辑:程序博客网 时间:2024/04/29 10:06
要通过滚动条显示文档,还必须知道文档滚动到了什么位置;一旦用户拖动滚动条时要告诉视图改变在文档中

的位置。所有这些,由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);//将视图坐标转换为文档作标
    
原创粉丝点击