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

MFC中的一些视图的更多相关文章

  1. VS2010 MFC中制作Visual Studio风格的停靠侧栏窗口(CDockablePane里嵌套FormView表单视图)

    VS2010 MFC中制作Visual Studio风格的停靠侧栏窗口(CDockablePane里嵌套FormView表单视图) 1. 在资源窗口里新建一个FormView的Dialog,修改ID为 ...

  2. MFC中 创建基于CFormView的文档视图程序

    在MFC中可以创建多种类型的窗口程序,如对话框程序.单文档结构程序(非文档/视图结构).单文档(文档/视图结构)以及多文档视图结构程序等. 在编写一般的小工具时,我们的首选显然是对话框程序,不过基于对 ...

  3. MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应

    MFC小程序截图: 一.在MFC中简单使用WebBrowser的ActiveX插件的方法: 见博文:  http://blog.csdn.net/supermanking/article/detail ...

  4. MFC中使用FLASH

    一.准备工作 第一步:下载并安装Adobe Flash Player. 从官方网站(http://get.adobe.com/cn/flashplayer/)上下载最新的Flash Player(大约 ...

  5. MFC中的各种DC区别

    转载自:xntop的<区别MFC中的CClientDC.CWindowDC.CPaintDC.CMetaFileDC> CClientDC及其子类 1. CClientDC类只能在客户区绘 ...

  6. MFC中对话框类(Dialog)的应用

    转载http://hi.baidu.com/jackywdx/item/feee8041d2c2e12310ee1e85 Windows应用程序通常是通过对话框接收用户输入.向用户输出信息,本节介绍应 ...

  7. MFC中添加消息响应函数

    转自:http://blog.csdn.net/eddy_liu/article/details/8474677 目前,用MFC设计的Windows应用程序几乎都采用文档/视图结构.这种程序框架与简单 ...

  8. 怎样在VS2013/MFC中使用TeeChart绘图控件

    TeeChart作为一款强大好用的绘图控件,通过它可以绘制出各式各样的图表,包括2D的,还有3D的,绘制的图表美观实用,这里主要讲述如何在VS2013/MFC中使用TeeChart控件,顺便说一下在V ...

  9. MFC中消息响应机制

    由于视类窗口始终覆盖在框架类窗口之上,因此所有操作,包括鼠标单击.鼠标移动等操作都只能由视类窗口捕获.一个MFC消息响应函数在程序中有三处相关信息:函数原型.函数实现和以及用来关联消息和消息响应函数的 ...

随机推荐

  1. 在Laravel项目中遇到的一些问题

    1. 控制器名字要跟控制器类名保持一致(当保存某个版本的文件时,我通常喜欢复制一份并重命名,这时候重命名的文件的类名并没有改变,着往往回影响结果,却一直找不出错在哪里),在备份的时候应该新建一个文件夹 ...

  2. SVN chechout 错误: xxx is not valid as filename in directory

    转载:https://blog.csdn.net/ClementAD/article/details/47838989 意思就是Linux系统允许文件或文件夹的名字包含空格,而windows是不允许的 ...

  3. Docker代理设置方法

    1.注意Docker版本(此处版本为docker-ce-18.06.1) docker version 2.编辑Docker服务配置文件 vim /usr/lib/systemd/system/doc ...

  4. Unity正交模式摄像机与屏幕适配的方法

    public class CameraAuto : MonoBehaviour { float fDefaultRatio = 720.0f / 1280.0f;//预先设定屏幕大小1280*720 ...

  5. python 代码求阶乘

    递归实现 1: #递归实现 def factorial(n): if n == 0: return 1 else: return n * factorial(n - 1)# 递归实现 递归实现 2: ...

  6. docker-3 Apache

    docker 安装 Apache 环境 docker pull httpd 文件创建连接(这样就可以不用发布了,两个文件夹会自动同步文件) ln -s /root/jenkins_home/works ...

  7. 安卓学习 intent

    其实学习了好几个星期了,是看老罗的视频,但进度太慢 今天 换了一本书 Intent 切换页面 啊啊啊啊 CompentName comp=new CompentName(MainActivity.th ...

  8. 怎么把微信里的文件发到QQ?

    对于如何将微信里的文件发到QQ这个问题,首先要看是在手机中操作还是在电脑上操作,针对不同的发送方式逐一介绍如下: 一.从手机微信发送文件到QQ 1.在手机微信中找到需要发送的文件打开,点击右上角竖排的 ...

  9. Linux内核基本装载卸载

    Linux由两部分组成:内核核心+内核模块核心的命名通常是vmlinuz-VERSION-release,模块的放置于/lib/modules/VERSION-release/ 一旦系统运行起来,内核 ...

  10. 上传到HDFS上的文件遇到乱码问题

    1.通过eclipse中的hdfs插件上传文件,上传成功,但是查看是乱码. 查阅文件本身的编码方式,发现是utf-8,同时文件在项目目录下,显示正常,因为我把它的编码格式也设成了utf-8. 2.通过 ...