视图的缩放的完整论述

2016-01-29 11:49 69 1 收藏

视图的缩放的完整论述,视图的缩放的完整论述

【 tulaoshi.com - C语言心得技巧 】


视图的缩放的完整论述

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

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

 

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com) 关键字:坐标系统、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
                        

来源:http://www.tulaoshi.com/n/20160129/1483502.html

延伸阅读
标签: word
Word 2010的视图模式   word2010中提供了多种视图模式供用户选择,这些视图模式包括页面视图、阅读版式视 图、Web版式视图、大纲视图和草稿视图等五种视图模式。用户可以在视图功能区中选择需要的文档视图模式,也可以在Word2010文档窗口的右下方单击视图按钮选择视图。 1.页面视图 页面视图可以显示Word2010文档的打印结...
标签: 办公软件
PowerPoint XP的界面 PowerPoint XP在界面上的最大的改动,莫过于是多语言支持啦。只要您安装有足够的语言包,就可以在不同语言的操作界面上自由切换。 在PowerPoint XP 仍然继承了以前版本在在菜单和工具栏的按钮上的风格,就是在一般状态下是平面的,当你的鼠标放上去的时候,就显示浮雕式的啦,这样的小小的变化,使人赏心悦目,...
改变视图单调的背景 作者:guodahai 下载代码工程 我们在用Visual C++写程序时,会看到她自动产生的界面背景非常的单调,我们可以自己来改变这个问题来实现美丽的背景,希望本文对初学者有所帮助。 本文代码运行效果图如下 下面来跟我做: 1.首先准备...
标签: InDesign
线型控制是我们在版面制作中经常遇到的问题。尤其是如何正确的使用缩放功能,是大家必须掌握的。 缩放功能看起来并不难,但实际应用中如果稍不留神就会出现错误。在使用中我们要注意以下几点: 1)尽量使用InDesign工具拦中的缩放工具 一般人都喜欢用手动方式进行缩放,其实这种习惯未必很好,原因是很难对线型进行精确的控...
标签: Web开发
原文地址:http://www.jackslocum.com/blog/2006/11/24/resizable-reloaded/ 这些范例展示了元素如何应用了一个浮动(默认)和装上可缩放的组件。 查看 basic.js 完整代码。 基本范例 这是个简单的可缩放的范例。在矩形附近可调节大小。这个例子采用了“浮动”的默认处理。 Resize Me!     var basic = new YAHOO.ext.Resiz...

经验教程

799

收藏

76
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部