`
webcenterol
  • 浏览: 950993 次
文章分类
社区版块
存档分类
最新评论

Windows GDI中的坐标系(一)

 
阅读更多

Windows GDI中的坐标系(一)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

By leezy_2000

2003-10-21 16:13

如果你用GDI输出过文本、位图、或者绘制过如直线、曲线的图形,那么你必然使用过坐标系。屏幕分辨率为96dpi(dot per inch),打印机的分辨率通常为600dpi,而你使用如

MoveTo(hDC,100,100);

LineTo(hDC,1300,1300);

在两者之上却可能生成完全相同的两条线(此即所见即所得WYSIWYG)。就实现原理而言,坐标系在其中扮演着决定性的角色。

一、什么是GDI坐标系?

首先从数学的角度看,GDI坐标系是二维笛卡尔坐标系,通过两条轴和原点就可以确定平面上任何一点的位置。

从使用的角度看,GDI坐标系是一种转换规则,把你所制定的逻辑数据转换成最终设备驱动所能使用的数据。比如(100,100)这一点,经过实际的变换,在96dpi的屏幕上就可能是(9.6,9.6),在600dpi的打印机上则可能是(60,60)。(注一)

GDI坐标系由四层坐标空间组成(注二),按层次的高低分别为:

世界坐标空间(World-Space):支持affine变换,应用于下面所说的页面坐标空间之上,只在NT类操作系统中有支持。

页面坐标空间(Page-Space):支持大量预定义的映射模式,是必然会被使用的坐标空间。原点和相应的缩放比率的设置适合在页面坐标空间中进行设定。

世界坐标空间和页面坐标空间统称为逻辑坐标空间,是GDI用户所能够直接使用的坐标空间。也就是说进行GDI输出时,你所指定的位置、大小等信息只能是相对于逻辑坐标空间的数据。

设备坐标空间(Device-Space):同设备上下文相关联的设备空间。可以表示物理设备的一小块或者整个物理设备。由于各种GDI输出是面向设备上下文的,逻辑坐标空间中的相关数据自然也就必须要转化为设备坐标空间中的数据。

物理设备坐标空间(Physical-Device Space):图形设备的物理表面的部分或全部。也就是图形驱动程序所使用的坐标空间。任何GDI输出最终想在显示器或打印机上成形都要经过相关的驱动程序,进行设备坐标空间向物理设备坐标空间的转换就成为一种必然。这个过程完全由系统完成。所以DC的原点和大小信息是只读的。(为表述方便以下将用DC表示设备上下文)

二、输出位置到底在那儿?

由上述说明可见最终输出位置的确定至少要经2次变换(如果你启用了世界坐标空间那是3次),有没有什么办法能够直接确定任意一个逻辑点最终会对应到那个物理位置呢?现成的没有,我们来自己实现一个,其实也并不复杂。首先要把逻辑坐标转化为设备坐标,这个过程要根据affine矩阵和当前映射模式做很多运算,但我们现在先不自己进行这种运算,而是使用

BOOL LPtoDP( 

HDC hdc, // handle to device context

 LPPOINT lpPoints, // array of points

 int nCount // count of points in array

);

这个函数负责把lpPoints中的逻辑坐标转换为同hdc相关联的设备坐标。(稍后我们来自己完成这个函数)。

因为设备坐标和物理设备坐标的单位是一致的,都是物理设备点。所以从设备坐标到物理设备坐标的转换没那么麻烦,只要知道了DC的原点就可以了(注意这里的原点是指设备坐标空间的原点在物理设备坐标空间中的位置)。这个任务的本质是去读取OS的DC结构,我们使用

BOOL GetDCOrgEx(

 HDC hdc, // handle to a DC

 LPPOINT lpPoint // translation origin

);

来完成这一任务。

这样的话,对于任意逻辑点logicalPoint,其DC原点为dcorgPoint有:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 414.75pt; HEIGHT: 50.25pt" type="#_x0000_t75"><img o:title="guocheng" src="/Develop/ArticleImages/21/21920/CSDN_Dev_Image_2003-11-31614500.png"><font size="3"></font></shape>

physicaldevicePoint就是logicalPoint理论上在物理设备坐标空间中的位置。此处需要说明的是由于物理设备坐标空间并不一定涵盖图形设备的整个物理表面,所以从physicaldevicePoint计算出的位置并不一定就是物理表面上的位置。比如说打印的时候就还要加上四周的不可打印区域才是其实际位置。同时显示器一类的设备还要考虑物理设备本身有没有进行缩放,如果没有(也就是说没用显示器下边的那些钮)那么你就会发现我们计算出的尺寸同相应点在屏幕上的位置符合的挺好。

void GetPhysicalPosition(HDC hDC,LPPOINT lpPoint ,int nCount)用于完成上述功能。具体实现见源码1。

分享到:
评论

相关推荐

    C# GDI+绘制直角坐标系并自定义绘图

    C# GDI+技术是.NET Framework提供的一种图形绘制工具,用于在Windows应用程序中创建和操纵图形。GDI+(Graphics Device Interface Plus)扩展了传统的GDI功能,提供了更丰富的绘图能力,包括矢量图形、图像处理和...

    GDI逻辑坐标的几个重点

    另一方面,`SetViewportOrg`函数用于设定视口的原点,即设备坐标系的参考点。当你调用`SetViewportOrg(x, y)`,这意味着设备坐标系的原点现在被设置到了(x, y),所有传入的逻辑坐标都将相对于这个新的原点进行映射。...

    GDI坐标变换详细总结

    世界坐标空间是指三维空间中的一种坐标系,而页面坐标空间是指二维空间中的一种坐标系。从世界坐标空间到页面坐标空间的变换是GDI坐标变换中的一项重要内容。 (1)平移变换 平移变换是指将图形元素沿着某个方向...

    GDI矩阵坐标.rar

    在GDI中,坐标系统是一个二维的平面,原点通常位于屏幕的左上角,X轴正方向向右,Y轴正方向向下。GDI矩阵是一个3x3的变换矩阵,用于描述这些几何变换。这个矩阵通常表示为: ``` [ m11 m12 0 ] [ m21 m22 0 ] [ dx ...

    Windows GDI+绘图学习笔记相关文章的源码

    【学习笔记】Windows GDI绘图(三)坐标系和坐标转换 【学习笔记】Windows GDI绘图(四)矩阵Matrix详解 【学习笔记】Windows GDI绘图(五)图形路径GraphicsPath详解(上) 【学习笔记】Windows GDI绘图(六)图形路径...

    C# GDI 坐标系中绘制曲线和点

    本篇文章将详细探讨如何利用C#的GDI功能在PictureBox控件中初始化一个坐标系,并在该坐标系内绘制曲线和点。 首先,我们需要了解GDI的基础概念。GDI提供了一系列的函数和对象,如Graphics、Pen、Brush等,它们分别...

    基于VC++的GDI常用坐标系统及应用

    在Windows中,默认的坐标系统采用笛卡尔坐标系,其中坐标原点位于屏幕的左上角,水平坐标轴正方向向右,垂直坐标轴正方向向下。例如,如果使用Ellipse函数绘制一个圆形,则需要根据这个坐标原点来指定圆形的位置和...

    Windows图形编程中的坐标系与GDI映射方式

    本文从GDI 映射方式入手, 对基于设备坐标的视口和基于逻辑坐标的窗口的概念、内涵及其相互关系进行了分析...在此基础上, 文章详述了怎样建立不同原点、单位和正方向的逻辑坐标系, 对坐标系的构建原理进行了深入剖析。

    Windows GDI和GDI+编程实例剖析

    它通过设备上下文(Device Context, DC)的概念,将逻辑坐标转换为设备坐标,使得在逻辑坐标系上的绘图操作能够映射到不同的物理设备上。 GDI函数分为多个类别,包括设备上下文管理、绘图、填充、属性设置、文本...

    GDI中的坐标映射问题

    坐标映射是GDI绘图程序开发中的一个重要概念。通过理解不同的坐标空间及其转换规则,开发者可以更好地控制图形的显示效果。掌握了这些基础知识后,即使面对复杂的绘图任务,也能更加从容不迫地处理坐标映射问题。

    VC++6下编写的GDI+2维坐标系

    在本文中,我们将深入探讨如何在VC++6环境中利用GDI+库来创建一个功能完备的2维坐标系。GDI+(Graphics Device Interface Plus)是Microsoft推出的一个图形处理库,它扩展了传统的GDI(Graphics Device Interface)...

    windows GDI的编程基础

    为了方便绘图,GDI 提供了坐标系转换的功能,包括屏幕坐标与客户区坐标的转换。 **API 函数:** - `PtToLP`: 将逻辑坐标转换为物理坐标。 - `LPtoDP`: 将物理坐标转换为逻辑坐标。 - `ScreenToClient`: 将屏幕坐标...

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

    在Windows环境中,设备坐标系的原点位于屏幕的左上角,X轴正向右延伸,Y轴正向下延伸。每个单位通常对应一个像素。 要实现在VC++中建立坐标系并进行坐标转换,我们需要理解GDI(Graphics Device Interface)提供的...

    Windows-GDI.zip

    8. **窗口和视口**:GDI在窗口系统中管理窗口和视口,确保图形在正确的坐标系下绘制,并且能正确响应窗口大小变化。 9. **光栅操作**:GDI提供了光栅操作,如位运算,用于像素级别的图像处理。 GDI+是GDI的增强...

    WindowsGDI

    2. **MM_ISOTROPIC**: 保持窗口和视口中的图形对称,坐标系设定为Optional,但X轴和Y轴的比例固定为1:1。 3. **MM_TEXT**: 默认的映射模式,一个逻辑单位映射成什么由系统确定。 映像模式的选择会影响图形的呈现...

    基于GDI的画图方法详解(适合初学者)

    其中,`DrawImage`函数是GDI+中最常用的图像绘制函数之一。`DrawImage`有多种重载形式,可以满足不同的绘图需求: 1. `Status DrawImage(Image* image, INT x, INT y);`——将图像绘制到指定坐标。 2. `Status ...

    GDI+ C# 地图放大缩小平移

    在IT领域,GDI+(Graphics Device Interface Plus)是Windows应用程序开发中用于图形处理的一种技术。它是Microsoft .NET Framework的一部分,提供了丰富的图形绘制和图像处理功能。本项目"GDIDemo"显然关注如何利用...

    用GDI+绘制的一个强大可移动坐标,已经增加了属性框。

    1. **坐标系统**:在GDI+中,开发者可以创建自定义的坐标系统,这里的“可移动坐标”意味着用户可以调整坐标轴的位置,这可能通过改变图形的原点位置来实现,原点的移动会影响所有后续的绘图操作。 2. **属性框**:...

    vc6中使用gdi+绘制2维图形的例子源码

    在VC6中使用GDI+绘制2维图形是一项常见的任务,尤其对于开发Windows桌面应用程序的程序员来说。GDI+(Graphics Device Interface Plus)是微软推出的一个图形处理库,它扩展了传统的GDI功能,提供了更丰富的图形绘制...

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

    设备坐标系是Windows中定位和绘制图形的基础。这是一种笛卡尔坐标系统,以像素为单位,x轴从左向右递增,y轴从上到下递增。对于视频显示设备,Windows通过将显示区域划分为不同的设备对象,以防止多个应用程序之间的...

Global site tag (gtag.js) - Google Analytics