本章主要介绍MFC中主要的视图类,这些继承自Cview类。
继承关系如上图所示。
滚动视图
CscrollView给Cview添加了基本的滚动功能,它包含WM_VSCROLL和WM_HSCROLL消息的处理程序,将设计滚动窗口的工作交由MFC来完成。
首先介绍一下基本概念,物理视图,指得是占据屏幕的视图窗口和空间;逻辑视图指的是可以使用滚动条看到的整个虚拟空间。
成员函数SetScrollSize接受4个参数,其中2个可选。
void SetScrollSizes(
int nMapMode, // 指定映射模式
SIZE sizeTotal, //指定视图逻辑尺寸的SIZE结构或Csize对象
const SIZE& sizePage = sizeDefault, //单击滚动轴时,MFC对视图的滚动量
const SIZE& sizeLine = sizeDefault); //单击滚动箭头时MFC对视图的滚动量
下列代码将视图设置为8.5 * 11英寸大小:
void CMyScrollView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
SetScrollSizes(MM_LOENGLISH, Csize(850, 1100));
}
在调用OnDraw时,映射模式已经设置成了在SetScrollSize调用中指定的模式,所以在OnDraw中不必再调用SetMapMode了。在使用CscrollView时应该记住两个原则:
如果在视图中OnDraw函数之外绘制输出,就要调用OnPrepareDC函数让MFC在输出中考虑映射模式和滚动位置的影响。
如果响应鼠标消息时执行命中测试,使用DptoLP将单击处的坐标从设备坐标转换为逻辑坐标,从而在命中测试中考虑映射模式和滚动位置的影响。
当滚动事件发生时,CscrollView就用OnVScroll或者OnHScroll消息处理程序捕获并调用ScrollWindow来水平或者垂直滚动视图。接着OnPaint函数将被调用,以此来绘制由ScrollWindow造成的实效窗口的一部分。而OnPaint函数中会获得CpaintDC对象,然后调用OnPrePareDC和OnDraw函数。
CscrollView包含一些成员函数,可以使用它们来操作滚动视图。
GetScrollPosition:从CscrollView中检索当前水平或者垂直滚动位置。
ScrollToPosition:滚动到给定位置
GetTotalSize:测量视图的逻辑宽度和高度。
SetScaleToFitSize:可以实现将整个逻辑视图缩放在物理视图中。
CscrollView对视图的OnDraw函数施加的压力要远比Cview大,但是通常由滚动事件导致的OnDraw调用仅要求重绘几行像素点,因此没必要重绘整个视图,否则可能造成滚动操作的效果很糟糕。优化OnDraw函数的关键函数就是CDC函数GetClipBox。它在传递给OnDraw的设备描述表对象中被调用,获得无效矩形的逻辑尺寸即需要重绘的视图部分。
HTML视图
使用Navigate函数或者是它的增强版Navigate2,前者只能用于文件系统对象,后者能够访问处于命令解释器的名字空间中任何地方。使用Navigate函数能够解析Html文件,以网页的形式在应用程序中显示。
树形视图
CtreeView相当简单,它从树形视图控件中派生了大多数功能,在MFC中,CtreeCtrl给树形视图控件提供了程序接口。一个树形视图是在树形视图控件的基础上调用CtreeCtrl函数编程实现的,CtreeView函数GetTreeCtrl返回该控件的引用。比如想要确定树形视图中包含项目的数量,就应该使用这样使用:
UINT count = GetTreeCtrl().getCount();
通过调用视图成员函数来获取相应的控件的引用,是所有MFC的CctrlView派生类共同使用的一种方法。
树形视图控件中的每个项目都是由文本字符串(也称标签)和可选的图形列表中的图形组成的。在MFC中,图形列表由类CImageList的实例来表示。实例中存储了位图,以0开始的索引号标识。
CtreeCtrl的SetImageList函数将CimageList的实例分配给树形视图。而CtreeCtrl的InsertItem函数给树形视图控件添加一个项目。树形视图的通知通常以WM_NOTIFY消息的形式出现,大多数情况下,NM_TREEVIEW指向一个NM_TREEVIEW结构。比如通过将LPSTR_TEXTCALLBACK和I_IMAGECALLBACK参数传递给InsertItem并处理TVN_GETDISPINFO通知来更新项目文本和图形。处理TVN_KEYDOWN通知自定义控件对键盘输入的响应。
列表视图
列表视图支持4中表现式样,大图标,小图标,列表,报表。ClistView从列表视图控件中派生了大部分的功能,要编制一个列表视图,可以调用ClistView::GetListCtrl()来获得出现在列表视图内部的控件的ClistCtrl引用,然后调用ClistCtrl函数使用返回的ClistCtrl引用。
在从ClistView派生类时,总要在派生类中覆盖PreCreateWindow并给视图一个以上的默认式样。
像ClistCtrl一样使用,可以参考网上的例子。
当数据量很多时,如果一次性添加进视图中,就会造成视图使用的内存非常大,查询一条数据非常耗时,这时就需要使用 MFC控件中虚拟列表控件的技术。(当然也可以使用分页技术。)具体百度。