merlinzjl

导航

MFC中的一些视图

本章主要介绍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控件中虚拟列表控件的技术。(当然也可以使用分页技术。)具体百度。

posted on 2018-04-25 21:17  merlinzjl  阅读(522)  评论(0编辑  收藏  举报