综述:
1.画图在逻辑坐标中画,使用逻辑单位,显示图形在物理坐标中显示
2.屏幕上有三种不同的物理坐标,每种物理坐标是固定死的,原点,XY轴方向都不变
1、客户区域坐标,包括应用程序的客户区域,客户区域的左上角为(0, 0)。
2、屏幕坐标,包括整个屏幕,屏幕的左上角为(0, 0)。屏幕坐标用在WM_MOVE消息中(对于非子窗口)以及下面的Windows 函数中:CreateWindow 和MoveWindow(都对于非子窗口)、GetMessage、GetCursorPos、GetWindowRect、WindowFromPoint 和SetBrushOrg 中。
用函数ClientToScreen 和ScreenToClient可以将客户区域坐标转换成屏幕区域坐标,或反之。
3、全窗口坐标,包括一个程序的整个窗口,包括标题条、菜单、滚动条和窗口框,窗口的左上角为(0,0)。使用GetWindowDC得到的窗口设备环境,可以将逻辑单位转换成窗口”坐标。
3.逻辑坐标有多种映射模式,可以改变坐标方向和每个像素点的大小,一旦固定了映射模式,就固定死了,原点,XY轴方向都不变
4.视口是物理坐标的一部分,默认初始状态下,它的中心点和物理坐标原点重叠
窗口是逻辑坐标的一部分,默认初始状态下,它的中心点和逻辑坐标中心点重叠
默认初始状态下,窗口中心点,视口中心点,逻辑坐标中心点,物理坐标原点在同一个位置重叠
视口、窗口和逻辑坐标的原点都是中心点
5.对图像的移动,包括用滚动条移动图像,都是调整视口(或窗口,一般是视口)实现的,比如滚动条向下拉10个单位, 变化的是视口的坐标原点(即视口矩形的中心点)相当于SetViewportOrg(0,-10)函数的功能
如果是移动窗口原点的话,是在逻辑坐标中移动图像,方向是逻辑坐标指定映射模式的轴方向。
SetViewportOrg(x,y)把窗口的原点(中心点)映射到视口的(x,y)点
SetWindowOrg(x,y)把窗口的(x,y)点映射到视口的原点
默认映射下:
SetViewportOrg(x,y) = SetWindowOrg(-x,-y)
6.画图并移动图像的步骤
1.在脑海中建立4个坐标(窗口坐标,视口坐标,逻辑坐标,物理坐标),窗口中心点,视口中心点,逻辑坐
标原点,物理坐标原点在同一个位置重叠
2.确定逻辑坐标的映射模式(即确定轴方向和像素点大小)
3.用CDC函数开始在逻辑坐标中画图
4.使用视口或窗口原点来移动图像到想要的位置。(设置视口或窗口原点)
7.MM_ANISOTROPIC和MM_ISOTROPIC用于自定义逻辑坐标和物理坐标的映射
使用MM_ISOTROPIC模式时,如果通过计算window与viewport范围的比值得到两个方向的单位刻度值不同,那么将会以较小的那个为准
MM_ANISOTROPIC允许两个坐标的刻度不一样
默认下,即没有用SetWindowExt来设定一个逻辑单位对应多少个像素的时候,MM_ANISOTROPIC和MM_ISOTROPIC使用MM_LOMETRIC映射模式,即Y向上,X向右,一个逻辑单位映射成0.1毫米 8. SetWindowExt(int Lwidth,int Lheight) //参数的单位为逻辑单位(Logical);
SetViewportExt(int Pwidth,int Pheight) //参数的单位为像素(Pixel);
以x轴为例(y轴类似),逻辑坐标系中的x轴的单位刻度=|Pwidth| / |Lwidth|。
这表示x轴上一个逻辑单位等于多少个像素。还有一点要注意的是,如果Lwidth与Pwidth同号,逻辑坐标的x轴方向与设备坐标系中的x轴方向相同,否则相反。
SetWindowExt设定的都是正值,则是X右Y下,负值相反。SetViewportExt也一样。
SetViewportExt和SetWindowExt设定的坐标值符号相反,则表示把窗口的轴方向映射到视口的反方向
SetWindowExt,SetViewportExt最好成对出现,不然会有一个默认的不确定的映射
问:当滚动条右向拉10个单位,逻辑坐标的(0,0)到什么地方去了呢?
答:还是(0,0)
分析:
1.滚动条移动是视口移动了.变化的是视口的坐标原点(即视口矩形的中心点)相当于SetViewportOrg(10,0)函数的功能.
2.绘图中坐标涉汲几个概念: 逻辑环境(画布)、窗口、设备环境、视口(设备环境大中的一部分)、坐标系、坐标转换(映像)。
逻辑环境:位置在想象中的并不存在;使用逻辑坐标(映像模式全是指逻辑坐标)坐标Y轴方向由设置的逻辑坐标模式来决定坐标。原点位置在逻辑环境的中心点,不可改动!坐标值可以有负值的!
窗口: 逻辑环境中的一小部分,是一个矩形框;坐标系是逻辑坐标,SetWindowOrg( )设置窗口矩形框的中心点(即窗口的原点,不是窗口矩形的左上角)的坐标,默认值为逻辑坐标的原点。
设备环境:显示器、打印机等等。坐标系为设备坐标系,正Y轴向下,正X轴向右,原点在左上角,固定不变,不可修改,其X、Y的负半轴为虚设,无法显示或无法打印图形。
视口: 设备环境中的一部分,一个矩形框;坐标系同设备环境。SetViewportOrg( )设置视口矩形框的中心点,默认值为坐标原点。视口是窗口的按比例的映像(投影),因设备环境的坐标系X、Y负半轴是虚设无法显示,故要常常平移视口。
//逻辑环境与窗口在一个平面上(联想:电影胶卷),设备环境与视口在一个平面上(联想:放映的屏幕)
//映像过程就是电影放映时图像的转换过程
坐标转换:编程时的“设备无关性”决定了绘图函数用的全是逻辑坐标,这就需要坐标转换语句来自动完成逻辑坐标单位向逻辑坐标单位的转换,因此要常常用到pDC->LPtoDP。坐标转换的过程是一个映像的过程,与坐标系方向无关,逻辑环境中画出的图与设备环境中显示的图形方向大小(各向同性和各向异性模式是按比例缩放;宽屏显示器横向自动放大比例)是一样的,画多大显示多大。 注意可以用SetViewportOrg( )和SetWindowOrg( )在任何绘图模式下进行平移,但是, SetViewportExt( )和SetWindowExt( )是为各向同性和各向异性模式预留的,其它模式用不用没什么区别,可以省略!当SetViewportExt( ),SetWindowExt()中的参数出现负数,说明坐标轴方向反向。对于各向同性和各向异性模式使用SetViewportExt( )前先用SetWindowExt( ),然后用pDC->LPtoDP()映像,最后就可以选画笔绘图了
LPtoDP()只对各向同性与各向异性模式(自定义模式)起作用,其它模式自带这个功能。 其它模式不需要用LPtoDP(),自动含这个功能.