`
cppmule
  • 浏览: 453954 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

设备坐标(DP)、客户坐标(Client)、逻辑坐标(LP)

    博客分类:
  • GDI
 
阅读更多

 1.逻辑坐标   
    
        逻辑坐标是独立于设备的,它与设备点的大小无关。使用逻辑单位,是实现"所见即所得"的基础。当程序员在调用一个画线的GDI函数LineTo,画出25.4mm(1英寸)     长的线时,他并不需要考虑输出的是何种设备。若设备是VGA显示器,Windows自动将其转化为96个像素点;若设备是一个300dpi的激光打印机,Windows自动将其转化为300个像素点。     
    
        2.设备坐标   
    
        Windows将GDI函数中指定的逻辑坐标映射为设备坐标,在所有的设备坐标系统中,单位以像素点为准,水平值从左到右增大,垂直值从上到下增大。   
    
        Windows中包括以下3种设备坐标,以满足各种不同需要:   
    
        (1)客户区域坐标,包括应用程序的客户区域,客户区域的左上角为(0,0)。   
    
        (2)屏幕坐标,包括整个屏幕,屏幕的左上角为(0,0)。屏幕坐标用在WM_MOVE消息中(对于非子窗口)以及下面的Windows函数中:CreateWindow和MoveWindow(都对于非子窗口)、GetMessage、GetCursorPos、GetWindowRect、WindowFromPoint和SetBrushOrg中。用函数ClientToScreen和ScreenToClient可以将客户区域坐标转换成屏幕区域坐标,或反之。     
    
        (3)全窗口坐标,包括一个程序的整个窗口,包括标题条、菜单、滚动条和窗口框,窗口的左上角为(0,0)。使用GetWindowDC得到的窗口设备环境,可以将逻辑单位转换成窗口坐标。   
    
        3.逻辑坐标与设备坐标的转换方式   
    
        映射方式定义了Windows如何将GDI函数中指定的逻辑坐标映射为设备坐标。要继续讨论映射方式我们要介绍Windows有关映射模式的一些术语:我们将逻辑坐标所在的坐标系称为"窗口",将设备坐标所在的坐标系称为"视口"。   
    
        "窗口"依赖于逻辑坐标,可以是像素点、毫米或程序员想要的其他尺度。     
    
        "视口"依赖于设备坐标(像素点)。通常,视口和客户区域等同。但是,如果程序员用GetWindowDC或CreateDC获取了一个设备环境,则视口也可以指全窗口坐标或屏幕坐标。点(0,0)是客户区域的左上角。x的值向右增加,y的值向上增加。   
    
        对于所有映射模式,Windows都用下面两个公式将窗口坐标转换成视口坐标:   
    
        xViewport=(xWindow-xWinOrg)*(xViewExt/xWinExt)+xViewOrg   
    
        yViewport=(yWindow-yWinOrg)*(yViewExt/yWinExt)+yViewOrg   
    
        其中,(xWindow,yWindows)是待转换的逻辑点,(xViewport,yViewport)是转换后的设备点。如果设备坐标是客户区域坐标或全窗口坐标,则Windows在画一个对象前,还必须将这些坐标转换成屏幕坐标。   
    
        这两个公式使用了分别指定窗口和视口原点的点:(xWinOrg,yWinOrg)是逻辑坐标的窗口原点;(xViewOrg,yViewOrg)是设备坐标的视口原点。在缺省的设备环境中,这两个点均设置为(0,0),但它们可以改变。此公式意味着,逻辑点(xWinOrg,yWinOrg)总被映射为设备点(xViewOrg,yViewOrg)。   
    
        Windows还能将视口(设备)坐标转换为窗口(逻辑)坐标:   
    
        xWindow=(xViewport-xViewOrg)*(xWinExt/xViewExt)+xWinOrg   
    
        yWindow=(yViewport-yViewOrg)*(yWinExt/yViewExt)+yWinOrg   
    
        可以使用Windows提供的两个函数DPtoLP和LPtoDP在设备坐标及逻辑坐标之间互相转换

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

视口

 

 

绘图操作只能在客户区中进行。除客户区以外的部分都叫非客户区

      在 Windows的作图函数中,涉及逻辑坐标到设备坐标的转换。这里提到的窗口(window)、视口(viewport)是对应的概念。视口是与设备相关的一个矩形区域,坐标单位是与设备相关的。窗口的坐标是逻辑坐标,与设备无关。窗口坐标的原点与视口坐标的原点始终对应于同一点。对于同一个图形,用窗口坐标系统表达的该区域的长和宽与视口的坐标系统表达的长和宽是不同的。二者就定义了这两个坐标系统的比例关系。程序作图时,使用的坐标总是是窗口坐标。而实际的显示或输出设备却各有自己的坐标。例如,有的打印机设备水平和垂直分辨率不同,其象素实际上是长方形。程序编写画一个圆,若不经任何坐标转换,在打印机上输出的就是个椭圆。下面程序示范了如何将窗口逻辑坐标的x,y向象素宽度均映射为输出设备中的 1/64 英寸。

[code]

    SetMapMode(hDC, MM_ISOTROPIC);

    SetWindowExtEx(hDC, 64, 64, NULL);

    SetViewportExtEx(hDC, GetDeviceCaps(hDC, LOGPIXELSX),

    GetDeviceCaps(hDC, LOGPIXELSY), NULL);

[/code]

调用SetWindowExt()函数后,紧接着应调用SetViewportExt()函数,它的任务是规定水平及垂直坐标轴的单位。可以这样认为,SetWindowExt()函数对应着“窗口”,SetViewportExt()函数对应着“视口”。几点:  

 

1.窗口是基于逻辑坐标的.  

2.视口是基于设备坐标.  

3.设备坐标是以像素为单位的,逻辑坐标是以.cm,m,mm,.....  

4.系统最后一定要把逻辑坐标变为设备坐标.  

5.设备坐标有3种:  

      a.GetDC() 客户区坐标.  

      b.GetWindowDC().窗口坐标.  

      c.GetDC(NULL),or    CreateDC()    .屏幕坐标.

 

问题如下:  

void CMyView::OnDraw(CDC *pDC)  

{  

...  

(1):pDC->SetMapMode(MM_ISOTROPIC);  

(2):pDC->SetWindowExt(4000,3000);  

(3):AfxGetMainWnd()->GetClientRect(cRect);  

(4):pDC->SetViewportExt(cRect.Width(),-cRect.Height());  

(5):pDC->DPtoLP(cRect);  

(6):pDC->SetWindowOrg(-(cRect.Width()/2),-(cRect.Height()/2));  

(7):pDC->TextOut(-850,1400,"abc");  

...  

}  

我想问一下:上面每一步执行完后,窗口和视口的原点、范围分别是多少?屏幕分辨率是(800,600)。谢谢!  

---------------------------------------------------------------  

第一句:定义逻辑单位和具体的设备单位的映射模式  

第二句:设置与设备上下文关联的窗口的X和Y坐标的范围。其中4000和3000是逻辑坐标。此时窗口大小为(4000,3000),视口大小未知。  

第三句:得到客户区尺寸。此尺寸就是当前视口尺寸。如果(800,600),在最大化时此尺寸为(800,5XX).  

第四句:设置视口的范围,第二个参数为负数,表示视口坐标往下移了cRect高度的一半。  

第五句:将设备坐标转换成逻辑坐标。因为GetClientRect得到的设备坐标  

第六句:设置设备上下文窗口的起始坐标。  

最后一句:在第六句的基础上,在逻辑坐标位置输出文本abc.   记住两个原则:

1.总是由窗口原点映射为视口原点。即无论你窗口的原点和视口的原点怎么变,窗口的原点总是映射到视口的原点。(记住:映射方向是窗口到视口,而不是视口向窗口映射)

2.不管利用函数(如:SetViewportOrgExt和SetWindowOrgEx)对窗口和视口的原点做怎么改变,设备点(0,0)始终是客户区的左上角。

分享到:
评论

相关推荐

    设备坐标(DP)、客户坐标(Client)、逻辑坐标(LP)在用法和含义上都有哪些区别呢?

    设备坐标(DP)是 Windows 将 GDI 函数中指定的逻辑坐标映射为设备坐标。在所有的设备坐标系统中,单位以像素点为准,水平值从左到右增大,垂直值从上到下增大。Windows 中包括以下三种设备坐标,以满足各种不同需要...

    Windows设备坐标与逻辑坐标详解

    设备坐标直接关联到特定设备的物理像素,而逻辑坐标是一种与设备无关的坐标系统,通常用于在不同分辨率的设备之间保持图形比例的一致性。GDI提供映射模式(如MM_TEXT)来转换逻辑坐标到设备坐标,确保图形在不同设备...

    WINDOWS逻辑设备,屏幕,客户区,坐标

    WINDOWS逻辑设备、屏幕、客户区、坐标系之间的关系 WINDOWS操作系统中,存在多种坐标系,包括逻辑坐标系、设备坐标系、屏幕坐标系、窗口坐标系和客户区坐标系。这五种坐标系之间存在着紧密的关系,了解它们之间的...

    状态条中显示鼠标的设备坐标与逻辑坐标

    在Windows编程中,尤其是在使用Microsoft Visual C++(VC)进行开发时,理解设备坐标和逻辑坐标对于创建自定义的用户界面至关重要。本篇文章将深入探讨“状态条中显示鼠标的设备坐标与逻辑坐标”的概念及其在VC矢量...

    Qt坐标系转换(绘制逻辑坐标系)

    世界坐标系原点在视图左上角,本例子通过世界坐标转换,将坐标原点定位在视图中央,Y轴向上,X轴向右,并绘制坐标轴,基于逻辑坐标系下的绘图,可将转换关系函数取消生效,对比世界坐标系下的绘图。 重写...

    屏幕坐标和客户区坐标的相互转换

    在计算机图形学中,屏幕坐标和客户区坐标是两个重要的概念,它们在Windows应用程序开发,尤其是使用VC++或MFC框架时,起着至关重要的作用。这篇文章将详细讲解这两个坐标系统的概念、转换方法以及如何在VC++环境中...

    VC中坐标系的建立_逻辑坐标,物理坐标,设备坐标

    ### VC中坐标系的建立——逻辑坐标、物理坐标、设备坐标 #### 一、设备坐标与逻辑坐标 在计算机图形学中,坐标系的选择对于绘制图形至关重要。在Visual C++ (VC) 开发环境中,主要涉及到三种类型的坐标系:设备...

    逻辑坐标与实际坐标.rar_c# 坐标_坐标_坐标 转换_逻辑坐标

    这个方法接受一个`CoordinateSpace`枚举,用于指定输入坐标的空间类型(逻辑或设备),以及另一个`CoordinateSpace`枚举,用于指定输出坐标的空间类型。例如,我们可以创建一个`Point`或`PointF`数组,包含逻辑坐标...

    GDI逻辑坐标的几个重点

    在Windows图形设备接口(GDI)中,逻辑坐标和设备坐标是两个重要的概念。逻辑坐标是程序员在编写代码时使用的坐标系统,而设备坐标则是实际显示在屏幕上的坐标系统。理解这两者的区别和相互作用是进行图形绘制的关键...

    VC++在屏幕坐标和窗口坐标之间转换

    在这种情况下,可能需要结合使用`GetWindowRect()`和`GetClientRect()`函数获取窗口的屏幕边界和客户区域边界,然后再进行坐标转换。 为了更好地理解这些概念,下面是一段示例代码,展示了如何在VC++中进行屏幕坐标...

    viewport 视口与窗口 逻辑坐标 设备坐标

    逻辑坐标与设备坐标 viewport 视口 窗口 GDI 坐标 映射方式定义了Windows如何将GDI函数中指定的逻辑坐标映射为设备坐标。 Windows有关映射模式的一些术语:逻辑坐标所在的坐标系称为"窗口",将设备坐标所在的坐标...

    易语言取用户区坐标和屏幕坐标

    客户区像素到逻辑坐标`函数可以将用户区的像素坐标转换为逻辑坐标,而`窗口.逻辑坐标到屏幕像素`函数则能将逻辑坐标转换为屏幕像素坐标。 下面是一段示例源码,用于演示如何获取鼠标在用户区和屏幕的坐标: ```...

    teechart屏幕坐标转换为实际坐标

    本文将深入探讨TeeChart屏幕坐标到实际坐标的转换,这对于理解和操作TeeChart图形控件至关重要。 TeeChart是一个跨平台的图表组件,支持多种编程语言,如Delphi, C++, .NET等,其功能强大,可以创建出专业级别的...

    VC建立坐标系,实现图形坐标系转换

    在VC++环境中,我们经常需要处理逻辑坐标系(World Coordinate System)和设备坐标系(Device Coordinate System)之间的转换,以便正确地在屏幕上绘制图形。这篇教程将深入探讨如何在VC++中建立坐标系并实现这两种...

    各地图API坐标系统比较与转换(WGS84坐标系、火星坐标系、百度坐标系、搜狗坐标系、图吧坐标系)

    设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系, * 谷歌地图采用的是WGS84地理坐标系(中国范围除外); * GCJ02坐标系:即火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS...

    three.js 3d坐标转平面坐标

    在3D图形编程中,Three.js是一个非常流行的JavaScript库,用于在Web浏览器中创建和展示三维模型和场景。...这通常通过Three.js库提供的函数和自定义的坐标转换逻辑来完成,确保3D场景与网页上的2D元素完美结合。

    Gps坐标系转换Java工具类WGS坐标与Google和百度坐标互转

    在`GpsUtils.java`文件中,这些方法的实现应该包括了必要的数学计算和坐标转换逻辑。使用时,只需传入相应的经纬度值,即可得到转换后的坐标。 在实际应用中,这些工具类对于处理跨平台的地图数据交换、地图标注...

    WGS84坐标系与任意坐标系坐标转换

    ### WGS84坐标系与任意坐标系坐标转换——理论与实践 #### 一、引言 随着全球定位系统(GPS)技术的迅速发展及其在地质矿产测量领域的广泛应用,坐标转换成为连接不同地理信息系统(GIS)的关键环节。WGS84坐标系...

    坐标转换文件.rar笛卡尔坐标matlab转换极坐标

    描述中提到,“直角坐标系转换球坐标系”,这可能是一个误解,因为通常的坐标转换是从笛卡尔坐标到极坐标,而不是到球坐标。球坐标通常涉及到三维空间,包含径向距离(r)、纬度(θ)和经度(φ)。不过,这里提及...

    CGCS2000、WGS84、百度高德等火星坐标、深圳独立坐标等常见坐标格式批量转换软件

    CGCS2000、WGS84、百度高德等火星坐标、深圳独立坐标等常见坐标格式批量转换软件。 一、本软件为博主本人开发,所有坐标转换精度均经实测验证,可放心使用。 二、本软件支持常见坐标,如CGCS2000、百度坐标、高德...

Global site tag (gtag.js) - Google Analytics