逻辑坐标、设备坐标的比较和关系

      

                                     逻辑坐标、设备坐标的比较和关系

      本文转载自了凡春秋的博客,http://blog.sina.com.cn/s/blog_6163bdeb0102dx87.html,仅作学术交流。

       在Windows中,文档坐标系称作逻辑坐标系,视图坐标系称为设备坐标系。它们之间的关系如下图所示:

                                                                                

     逻辑坐标按照坐标设置方式(又成为映射模式)可分为8种,它们在坐标上的特性如下表所示:

 

映射模式

逻辑单位

x递增方向

y递增方向

MM_TEXT

像素

向右

向下

MM_LOMETRIC

0.1mm

向右

向上

MM_HIMETRIC

0.01mm

向右

向上

MM_LOENGLISH

0.01inch

向右

向上

MM_HIENGLISH

0.001inch

向右

向上

MM_TWIPS

1/1440inch

向右

向上

MM_ISOTROPIC

可调整 (x=y)

可选择

可选择

MM_ANISOTROPIC

可调整(x!=y

可选择

可选择

        我们一般使用的映射模式是MM_TEXT,它也是缺省设置。在该模式下,坐标原点在工作区左上角,而x坐标值是向右递增,y坐标值是向下递增,单位值1代表一个像素。要设置映射模式,可以调用CDC::SetMapMode()函数。

CClientDC dc;

nPreMapMode=dc.SetMapMode(nMapMode);

它将映射模式设置为nMapMode,并返回前一次的映射模式nPreMapModeGetMapMode可取得当前的映射模式:

CClientDC dc;

nMapMode=dc.GetMapMode();

MFC绘图函数都使用逻辑坐标作为位置参数。比如

CString str(“Hello,world!”);

dc.TextOut(10,10,str,str.GetLength());

         这里的(10,10)是逻辑坐标而不是像素点数(只是在缺省映射模式MM_TEXT下,正好与像素点相对应),在输出时GDI函数会将逻辑坐标(10,10)依据当前映射模式转化为设备坐标,然后将文字输出在屏幕上。

设备坐标以像素点为单位,且x轴坐标值向右递增,y轴坐标值向下递增,但原点(0,0)位置却不限定在工作区的左上角。依据设备坐标的原点和用途,可以将Windows下使用的设备坐标系统分为三种:工作区坐标系统,窗口坐标系统和屏幕坐标系统

1)工作区坐标系统:

工作区坐标系统是最常见的坐标系统,它以窗口客户区左上角为原点(0,0),主要用于窗口客户区绘图输出以及处理窗口的一些消息。鼠标消息WM_LBUTTONDOWNWM_MOUSEMOVE传给框架的消息参数以及CDC一些用于绘图的成员都是使用工作区坐标。

2)屏幕坐标系统:

屏幕坐标系统是另一类常用的坐标系统,以屏幕左上角为原点(0,0。以CreateDC(“DISPLAY” , ...)GetDC(NULL)取得设备上下文时,该上下文使用的坐标系就是屏幕坐标系。

一些与窗口的工作区不相关的函数都是以屏幕坐标为单位,例如设置和取得光标位置的函数SetCursorPos()GetCursorPos();由于光标可以在任何一个窗口之间移动,它不属于任何一个单一的窗口,因此使用屏幕坐标。弹出式菜单使用的也是屏幕坐标。另外,CreateWindowMoveWindowSetWindowPlacement()等函数用于设置窗口相对于屏幕的位置,使用的也是屏幕坐标系统。

3)窗口坐标系统:

窗口坐标系统以窗口左上角为坐标原点,它包含了窗口控制菜单、标题栏等内容。一般情况下很少在窗口标题栏上绘图,因此这种坐标系统很少使用。

三类设备坐标系统关系如下图所示:

                                                           

         MFC提供ClientToScreen()ScreenToClient()两个函数用于完成工作区坐标和屏幕坐标之间的转换工作。

void ScreenToClient( LPPOINT lpPoint ) const;

void ScreenToClient( LPRECT lpRect ) const;

void ClientToScreen( LPPOINT lpPoint ) const;

void ClientToScreen( LPRECT lpRect ) const;

       其实,我们在前面介绍弹出式菜单时已经使用了ClientToScreen函数。在那里,由于弹出式菜单使用的是屏幕坐标,因此当处理弹出式菜单快捷键shift+F10时,如果要在窗口左上角(5,5)处显示快捷菜单,就必须先调用ClientToScreen函数将客户区坐标(5,5)转化为屏幕坐标。

CRect rect;

GetClientRect(rect);

ClientToScreen(rect);

point = rect.TopLeft();

point.Offset(5, 5);

在视图滚动后,如果用户在视图中单击鼠标,那么会得到鼠标位置的设备(视图)坐标。在使用这个数据处理文档(比如画点或画线)时,需要把它转化为文档坐标。这是因为利用MFC绘图时,所有传递给MFC作图的坐标都是逻辑坐标。当调用MFC绘图函数绘图时,Windows自动将逻辑坐标转换成设备坐标,然后再绘图。设备上下文类CDC提供了两个成员函数LPToDPDPToLP完成逻辑坐标和设备坐标之间的转换工作。如其名字所示那样,LPToDP将逻辑坐标转换为设备坐标,DPToLP将设备坐标转换为逻辑坐标。

void LPtoDP( LPPOINT lpPoints, int nCount = 1 ) const;

void LPtoDP( LPRECT lpRect ) const;

void LPtoDP( LPSIZE lpSize ) const;

void DPtoLP( LPPOINT lpPoints, int nCount = 1 ) const;

void DPtoLP( LPRECT lpRect ) const;

void DPtoLP( LPSIZE lpSize ) const;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt中的逻辑坐标和物理坐标是两种不同的坐标系统。 逻辑坐标是相对于Qt应用程序的窗口的坐标系统。它是与应用程序的界面大小相关的坐标系统,可以通过该坐标系统来进行图形绘制、事件处理等操作。逻辑坐标可以使用像素、百分比等单位进行表示,具有一定的抽象性。 物理坐标是相对于屏幕或设备坐标系统。它是与实际显示设备的像素大小相关的坐标系统,用于确定真实的显示位置和大小。物理坐标通常使用像素作为单位进行表示,具有客观的实际意义。 在Qt中,通过QPainter等绘图工具可以在逻辑坐标系下进行绘制操作。可以通过设置Qt应用程序的窗口大小和缩放因子来调整逻辑坐标与实际显示像素之间的映射关系,实现适应不同分辨率和显示设备的界面布局。同时,Qt还提供了方便的坐标转换函数,可以在逻辑坐标系和物理坐标系之间进行转换。 总之,Qt中的逻辑坐标和物理坐标是两种不同的坐标系统,分别用于应用程序界面的绘制操作和实际显示设备的显示位置确定。合理使用逻辑坐标和物理坐标可以帮助开发者实现跨平台、适应不同分辨率的应用程序界面。 ### 回答2: 在Qt中,有两种坐标系统:逻辑坐标和物理坐标逻辑坐标是相对于绘图设备坐标系统,它是独立于具体的硬件设备的。在Qt中,逻辑坐标的原点通常位于绘图设备的左上角,水平向右为正方向,垂直向下为正方向。逻辑坐标可以用于设置图形的位置和大小,以及进行绘图操作。例如,可以通过设置逻辑坐标来实现平移、缩放和旋转等操作,使得绘制的图形能够适应不同的显示设备。 物理坐标是相对于实际物理设备坐标系统,它与硬件设备相关。物理坐标的原点和方向可能与逻辑坐标不同,根据不同的设备和操作系统,原点位置和轴的方向可能有所不同。物理坐标通常用于获取设备的实际位置和大小,以及进行与设备相关的操作,例如打印输出和屏幕截图等。 在Qt中,可以通过使用转换函数来在逻辑坐标和物理坐标之间进行转换。例如,可以使用QTransform类中的函数来将逻辑坐标转换为物理坐标,或者将物理坐标转换为逻辑坐标。通过使用这些转换函数,可以在不同的坐标系统之间进行切换,以适应不同的需求和设备。 ### 回答3: qt中的逻辑坐标和物理坐标是两种不同的坐标系统。 逻辑坐标是在程序中使用的坐标系统,用于定位和绘制图形界面元素。在逻辑坐标系中,坐标的原点通常是左上角,x轴向右增加,y轴向下增加。逻辑坐标的单位可以是像素,也可以是任意自定义的单位。使用逻辑坐标可以使得界面在不同分辨率的屏幕上以相同的比例显示,从而实现界面的自适应性。 物理坐标是与实际硬件设备相关的坐标系统,用于定位物理位置。物理坐标的原点和方向通常由硬件设备决定,例如屏幕的原点可能是左上角,也可能是左下角,坐标轴的方向也可能与逻辑坐标相反。物理坐标的单位通常是像素。使用物理坐标可以精确地定位物理位置,但在不同分辨率的屏幕上可能会导致界面显示的比例不一致。 在Qt中,通过QPainter类可以方便地在逻辑坐标系中进行绘制操作。在绘制过程中,可以使用QTransform类来进行逻辑坐标到物理坐标之间的转换。Qt还提供了QScreen类来获取和管理物理坐标系相关的信息。 总之,逻辑坐标和物理坐标是两种不同的坐标系统,用于在软件中定位和绘制界面元素以及在硬件设备上定位物理位置。在Qt中,可以使用逻辑坐标和物理坐标来实现界面的自适应和精确定位。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值