当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 视图的缩放的完整论述

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 视图的缩放的完整论述


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 162 ::
收藏到网摘: n/a


视图的缩放的完整论述

作者:中国电力科学研究院计算所 康建东

下载演示映射模式
下载视图放大/缩小演示程序


 

关键字:坐标系统、CScrollView、视图缩放、窗口、视口
    笔者采用Visual C++6.0开发图形数据支持系统,其中的难点正在于理解坐标系统的含义、各种映射模式的意义以及与逻辑坐标的转换。下面分几个部分逐一进行论述:
一 坐标系统概述
    众所周知,VC中的坐标系统分为逻辑坐标和设备坐标,逻辑坐标就是内存中虚拟的坐标,我们可以理解为看不见的,而设备坐标就是跟具体的设备相联系的坐标系统,如:显示器和打印机等。不同的映射模式决定了设备坐标和逻辑坐标之间的转换关系,也就是两种坐标系统在相互转换时,逻辑单位和设备单位之间的某种比例关系。这里需要说明的是:Windows中,只有对需要设备环境句柄作参数的GDI函数,映射方式才会起作用。
对于视口和窗口的概念比较的容易混淆,其实窗口和视口是与映射模式相关联的:映射方式就是用于从"窗口"(逻辑坐标)到"视口"(设备坐标)的映射。"视口"是基于设备坐标的,通常,视口与客户区相同;"窗口"是基于逻辑坐标的,逻辑坐标可以是像素、毫米、英寸等。
下面的公式是将窗口(逻辑)坐标转化为视口(设备)坐标:
 xViewport = (xWindow - xWinOrg)*xViewExt/xWinExt + xViewOrgyViewport = (yWindow - yWinOrg)*yViewExt/yWinExt + yViewOrg(xWindow,yWindow)是待转换的逻辑点,(xViewport,yViewport)是转换后的设备坐标。 
    设备坐标的视口原点(xViewOrg,yViewOrg)和逻辑坐标的窗口原点(xWinOrg,yWinOrg)默认情况下均被设置成(0,0),但具体情况下可以改变;(xWinExt,yWinExt)是逻辑坐标的窗口范围;(xViewExt,yViewExt)是设备坐标的窗口范围,在多数映射方式下,范围是映射方式所隐含的,不能改变。注意:每个范围自身没有什么意义,但是视口范围和窗口范围的比是逻辑单位转换为设备单位的换算因子。例如,对于MM_LOENGLISH模式,xViewExt/xWinExt 表示每0.01英寸(一个逻辑单位)中水平像素数。
二 映射模式及视图缩放
    对于标准的映射模式,这里不作讨论,下面重点的说明MM_ISOTROPIC和MM_ANISOTROPIC两种映射模式,这两种模式用户可以控制逻辑单位和像素之间的比例。两种方式的概念上的差异在于各向同性和各向异性,也就是坐标的建立是否可以定义不同的方向和单位长度。下面举一个视图缩放的例子来具体说明。
 Void CMyView::OnPrepareDC(){	CView::OnPrepareDC(pDC,pInfo);	CDC* pDC;	pDC->SetMapMode(MM_ANISOTROPIC);	int xLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSX);	int yLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSY);	pDC->SetWindowExt(100,100);	pDC->SetViewportExt(xLogPixPerInch, yLogPixPerInch);}
    我们说过视口的幅度通常是屏幕客户区域的大小,而在上面的代码里我们并没有这样做。这样做可以吗?其实,在MM_TEXT的映射模式下,缺省的窗口范围和视口范围均为(1,1),从中可见,我们要设置的只是xViewExt/xWinExt的比值来决定显示比例的大小,而与xViewExt(视口范围)和xWinExt(窗口范围)的关系不大。GetDeviceCaps(LOGPIXELSX)和GetDeviceCaps(LOGPIXELSY)代表每逻辑英寸对应的水平像素点数;xLogPicPerInch/100代表每0.01逻辑单位对应的水平像素数目;那么100是什么意思呢?这就对应着每逻辑英寸对应的逻辑单位数目,也就是每逻辑单位对应于0.01逻辑英寸,有人会问,这不正是MM_LOENGLISH 方式吗?那么我们作做这样一个测试(见Demo),在OnDraw()中分别设置两种映射模式,看看到底有什么不同。
 void CTestView::OnDraw(CDC* pDC){	CTestDoc* pDoc = GetDocument();	ASSERT_VALID(pDoc);	pDC->SetMapMode(MM_ANISOTROPIC);	int xLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSX);	int yLogPixPerInch = pDC->Ge