MFC让文档/视图结构程序支持滚动条
2011-08-22 16:57
495 查看
转载自: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);//将视图坐标转换为文档坐标
要通过滚动条显示文档,必须知道文档滚动到了什么位置;一旦用户拖动滚动条时要告诉视图改变在文档中的位置。所有这些,由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);//将视图坐标转换为文档坐标
相关文章推荐
- MFC让文档/视图结构程序支持滚动条
- MFC让文档/视图结构程序支持滚动条
- MFC让文档/视图结构程序支持滚动条
- 文档-视图结构下MFC程序的全屏显示
- MFC文档视图结构程序结构总揽
- 基于MFC多文档多视图结构的OGRE指北针程序
- [MFC]文档/视图结构的命令传送和预定义命令ID(包括命令处理程序)
- MFC 文档视图结构程序结构总揽
- 文档-视图结构下MFC程序的全屏显示
- 1.1 MFC 文档视图结构程序结构总揽
- 文档-视图结构下MFC程序的全屏显示
- MFC 文档视图结构程序结构总揽
- MFC浅析(3) 文档视图结构中命令的处理流程
- 深入分析MFC文档视图结构(项目实践)
- vs2005里,建立一个MFC单文档程序,未选择数据库支持,后来需要用sql server的处理方法
- MFC文档/视图结构关联基类学习
- MFC文档视图结构解析--改造原结构--实用项目实践
- VS2013 MFC做的文档中英文分拣(支持xml excel text格式)屏蔽字宏 游戏便捷小程序
- MFC浅析(1) 文档视图结构中,缺省的命令处理
- 深入分析MFC文档视图结构