本章主要介绍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. 关于jqGrid组件表格无法自适应宽度问题

    今天生成了一个4列的表格,但是无法自适应宽度,使用 $(window).resize(function(){ $(window).unbind("onresize"); $(&qu ...

  2. centos7 安装部署gitlab

    Gitlab官网地址:https://about.gitlab.com/downloads/ Linux系统环境: Centos7 gitlab服务安装之前需要安装一些依赖包:yum install ...

  3. anaconda使用方法

    我是用的win10.想写爬虫,所以使用了  anaconda .总结一下使用的方法. 安装阶段跳过.: 再终端输入  jupyter notebook  然后就会在. 浏览器显示一个网页.其实这个也不 ...

  4. tiny4412 --Uboot移植(4) 串口

    开发环境:win10 64位 + VMware12 + Ubuntu14.04 32位 工具链:linaro提供的gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-g ...

  5. struts 1.x配置文件说明

    <struts-config> <global-exceptions /> <!--全局映射定义--> <global-forwards> <fo ...

  6. POS VB

    PPSM06S70:  Add  moddate EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, 'yyyy/mm/dd/HH24:MI AM')) ACTUAL_ ...

  7. d3.js画折线图

    下载d3.zip,并解压到网页文件所在的文件夹 windows下,在命令行进入网页文件夹,输入 python -m http.server 在浏览器中输入127.0.0.1:8000/xxx.html ...

  8. java36

    1.Main public static void main(String [ ] args) public:被jvm调用的方法,权限要足够大 static:被jvm调用的方法,不需要创建对象,直接用 ...

  9. Spring Boot jsp页面无法跳转问题

    可能的情况如下: 1.未在pom.xml中添加依赖 <!-- jsp 视图支持--> <dependency>    <groupId>org.apache.tom ...

  10. python第三天基础之字符编码

    一 了解字符编码的知识储备 1. 文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就打开了启动了一个进程,是在内存中的,所以在编辑器编写的内容也都是存放与内存中的, ...