在Windows API中混淆逻辑坐标和设备坐标

Ken*_*nta 8 c++ mfc gdi coordinates visual-c++

我一直在寻找到它使用两种功能的Visual Studio的C++ Windows应用程序项目SetWindowExt (...)和SetViewportExt (...).我对这两个函数的作用以及为什么它们是必要的而感到困惑.搜索这些函数,我得出了逻辑坐标和设备坐标的概念.

任何人都可以解释这两个概念的重要性吗?

Cod*_*ray 11

设备坐标是最容易理解的.它们与您正在使用的设备直接相关 - 例如,屏幕或打印机.

例如,让我们看一下屏幕上显示的窗口.设备坐标是相对于特定设备定义的,因此在窗口的情况下,一切都将在客户端坐标中.这意味着原点将是窗口客户区的左上角,y轴将从上到下运行.所有单位都以像素为单位进行测量,因为这是一个屏幕上的元素.

你总是使用这些,所以你可能已经比你想象的更好地理解了它们.例如,无论何时处理鼠标事件或调整窗口大小,都可以获取并设置设备坐标.

逻辑坐标考虑当前的映射模式.每个设备上下文(DC)都可以应用映射模式(GetMapMode和SetMapMode).各种可用的映射模式由MM_Xxx值定义.这些不同的映射模式中的每一个将导致原点和y轴方向被不同地解释.文档将告诉您它们的确切工作方式.

当您操纵设备上下文(例如,绘制到它上面)时,会考虑当前的映射模式,因此您可以使用逻辑坐标.

使用默认MM_TEXT映射模式,每个逻辑单元映射到一个设备单元(请记住,对于一个窗口,这将是一个像素),因此不需要转换.在此映射模式下,逻辑和设备坐标系统的工作方式完全相同.由于这是默认设置,可能是您大部分时间都在使用的设备,因此可能是您混淆的原因.

相关阅读: 坐标空间和转换(MSDN)