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控件中虚拟列表控件的技术。(当然也可以使用分页技术。)具体百度。
MFC中的一些视图的更多相关文章
- VS2010 MFC中制作Visual Studio风格的停靠侧栏窗口(CDockablePane里嵌套FormView表单视图)
VS2010 MFC中制作Visual Studio风格的停靠侧栏窗口(CDockablePane里嵌套FormView表单视图) 1. 在资源窗口里新建一个FormView的Dialog,修改ID为 ...
- MFC中 创建基于CFormView的文档视图程序
在MFC中可以创建多种类型的窗口程序,如对话框程序.单文档结构程序(非文档/视图结构).单文档(文档/视图结构)以及多文档视图结构程序等. 在编写一般的小工具时,我们的首选显然是对话框程序,不过基于对 ...
- MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应
MFC小程序截图: 一.在MFC中简单使用WebBrowser的ActiveX插件的方法: 见博文: http://blog.csdn.net/supermanking/article/detail ...
- MFC中使用FLASH
一.准备工作 第一步:下载并安装Adobe Flash Player. 从官方网站(http://get.adobe.com/cn/flashplayer/)上下载最新的Flash Player(大约 ...
- MFC中的各种DC区别
转载自:xntop的<区别MFC中的CClientDC.CWindowDC.CPaintDC.CMetaFileDC> CClientDC及其子类 1. CClientDC类只能在客户区绘 ...
- MFC中对话框类(Dialog)的应用
转载http://hi.baidu.com/jackywdx/item/feee8041d2c2e12310ee1e85 Windows应用程序通常是通过对话框接收用户输入.向用户输出信息,本节介绍应 ...
- MFC中添加消息响应函数
转自:http://blog.csdn.net/eddy_liu/article/details/8474677 目前,用MFC设计的Windows应用程序几乎都采用文档/视图结构.这种程序框架与简单 ...
- 怎样在VS2013/MFC中使用TeeChart绘图控件
TeeChart作为一款强大好用的绘图控件,通过它可以绘制出各式各样的图表,包括2D的,还有3D的,绘制的图表美观实用,这里主要讲述如何在VS2013/MFC中使用TeeChart控件,顺便说一下在V ...
- MFC中消息响应机制
由于视类窗口始终覆盖在框架类窗口之上,因此所有操作,包括鼠标单击.鼠标移动等操作都只能由视类窗口捕获.一个MFC消息响应函数在程序中有三处相关信息:函数原型.函数实现和以及用来关联消息和消息响应函数的 ...
随机推荐
- 在Laravel项目中遇到的一些问题
1. 控制器名字要跟控制器类名保持一致(当保存某个版本的文件时,我通常喜欢复制一份并重命名,这时候重命名的文件的类名并没有改变,着往往回影响结果,却一直找不出错在哪里),在备份的时候应该新建一个文件夹 ...
- SVN chechout 错误: xxx is not valid as filename in directory
转载:https://blog.csdn.net/ClementAD/article/details/47838989 意思就是Linux系统允许文件或文件夹的名字包含空格,而windows是不允许的 ...
- Docker代理设置方法
1.注意Docker版本(此处版本为docker-ce-18.06.1) docker version 2.编辑Docker服务配置文件 vim /usr/lib/systemd/system/doc ...
- Unity正交模式摄像机与屏幕适配的方法
public class CameraAuto : MonoBehaviour { float fDefaultRatio = 720.0f / 1280.0f;//预先设定屏幕大小1280*720 ...
- python 代码求阶乘
递归实现 1: #递归实现 def factorial(n): if n == 0: return 1 else: return n * factorial(n - 1)# 递归实现 递归实现 2: ...
- docker-3 Apache
docker 安装 Apache 环境 docker pull httpd 文件创建连接(这样就可以不用发布了,两个文件夹会自动同步文件) ln -s /root/jenkins_home/works ...
- 安卓学习 intent
其实学习了好几个星期了,是看老罗的视频,但进度太慢 今天 换了一本书 Intent 切换页面 啊啊啊啊 CompentName comp=new CompentName(MainActivity.th ...
- 怎么把微信里的文件发到QQ?
对于如何将微信里的文件发到QQ这个问题,首先要看是在手机中操作还是在电脑上操作,针对不同的发送方式逐一介绍如下: 一.从手机微信发送文件到QQ 1.在手机微信中找到需要发送的文件打开,点击右上角竖排的 ...
- Linux内核基本装载卸载
Linux由两部分组成:内核核心+内核模块核心的命名通常是vmlinuz-VERSION-release,模块的放置于/lib/modules/VERSION-release/ 一旦系统运行起来,内核 ...
- 上传到HDFS上的文件遇到乱码问题
1.通过eclipse中的hdfs插件上传文件,上传成功,但是查看是乱码. 查阅文件本身的编码方式,发现是utf-8,同时文件在项目目录下,显示正常,因为我把它的编码格式也设成了utf-8. 2.通过 ...