逻辑坐标与设备坐标——全窗口坐标、屏幕坐标、客户区坐标的总结

Windows应用程序绘制图形时使用的是一种逻辑单位,每个逻辑单位的大小由映射模式决定,这个逻辑单位既可以与设备单位(屏幕或打印机上的一个 像素点)相同,也可以是一种物理单位(如毫米),还可以是用户自定义的一种单位。在Windows应用程序中,只要与输出有关系,都要使用映射模式。

首先谈谈映射模式基本知识,当Windows应用程序在其客户区绘制图形时,必须给出在客户区的位置,其位置用x和y 两个坐标表示,x表示横坐标,y表示纵坐标。在所有的GDI绘制函数中,这些坐标使用的是一种"逻辑单位"。当GDI函数将输出送到某个物理设备上 时,Windows将逻辑坐标转换成设备坐标(如屏幕或打印机的像素点)。逻辑坐标和设备坐标的转换是由映射模式决定的。映射模式被储存在设备环境中。 GetMapMode函数用于从设备环境得到当前的映射模式,SetMapMode函数用于设置设备环境的映射模式。

设备坐标(Device Coordinate)又称物理坐标(Physical Coordinate),指输出设备上的坐标。通常将屏幕上的设备坐标称为屏幕坐标。设备坐标用对象距离窗口左上角的水平距离和垂直距离来指定对象的位 置,是以像素为单位来表示的,设备坐标的X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角。当程序员在调用一个画线的GDI函数LineTo,画出 25.4mm(1英寸) 长的线时,他并不需要考虑输出的是何种设备。若设备是VGA显示器,Windows自动将其转化为96个像素点;若设备是一个300dpi的激光打印 机,Windows自动将其转化为300个像素点。

逻辑坐标(Logical Coordinate)是系统用作记录的坐标。在缺省的模式(MM_TEXT)下,逻辑坐标的方向和单位与设备坐标的方向和单位相同,也是以像素为单位来表示的,X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角。

逻辑坐标和设备坐标在以下缺省模式中一般是一致的:

1.窗口为非滚动窗口

2.窗口为滚动窗口,垂直滚动条位于滚动边框的最上端,水平滚动条位于最左端

Windows中包括以下3种设备坐标,以满足各种不同需要:

1.客户区域坐标,包括应用程序的客户区域,客户区域的左上角为(0,0)。

2.屏幕坐标,包括整个屏幕,屏幕的左上角为(0,0)。屏幕坐标用在WM_MOVE消息中(对于非子窗口)以及下面的Windows函数 中:CreateWindow和MoveWindow(都对于非子窗口)、GetMessage、GetCursorPos、 GetWindowRect、WindowFromPoint和SetBrushOrg中。用函数ClientToScreen和 ScreenToClient可以将客户区域坐标转换成屏幕区域坐标,或反之。

3.全窗口坐标,包括一个程序的整个窗口,包括标题条、菜单、滚动条和窗口框,窗口的左上角为(0,0)。使用GetWindowDC得到的窗口设备环境,可以将逻辑单位转换成窗口坐标。

 

Windows中逻辑坐标所在的坐标系称为"窗口",将设备坐标所在的坐标系称为"视口"。

"窗口"依赖于逻辑坐标,可以是像素点、毫米或程序员想要的其他尺度。

"视口"依赖于设备坐标(像素点)。通常,视口和客户区域等同。但是,如果程序员用GetWindowDC或CreateDC获取了一个设备环境,则视口也可以指全窗口坐标或屏幕坐标。点(0,0)是客户区域的左上角。x的值向右增加,y的值向下增加。

对于所有映射模式,Windows都用下面两个公式将窗口坐标转换成视口坐标:

xViewport=(xWindow-xWinOrg)*(xViewExt/xWinExt)+xViewOrg

yViewport=(yWindow-yWinOrg)*(yViewExt/yWinExt)+yViewOrg

其中,(xWindow,yWindows)是待转换的逻辑点,(xViewport,yViewport)是转换后的设备点, (xWinOrg,yWinOrg)是逻辑坐标的窗口原点;(xViewOrg,yViewOrg)是设备坐标的视口原点。在缺省的设备环境中,这两个点 均设置为(0,0),但它们可以改变。此公式意味着,逻辑点(xWinOrg,yWinOrg)总被映射为设备点 (xViewOrg,yViewOrg)。如果设备坐标是客户区域坐标或全窗口坐标,则Windows在画一个对象前,还必须将这些坐标转换成屏幕坐标。

Windows还能将视口(设备)坐标转换为窗口(逻辑)坐标:

xWindow=(xViewport-xViewOrg)*(xWinExt/xViewExt)+xWinOrg

yWindow=(yViewport-yViewOrg)*(yWinExt/yViewExt)+yWinOrg

可以使用Windows提供的两个函数DPtoLP和LPtoDP在设备坐标及逻辑坐标之间互相转换。

Windows定义了8种映射方式。

上述映射模式中又可分成以下3类:

MM_TEXT映射模式这种映射模式被称为"文本"映射方式,不是因为它对于文本最合适,而是轴的方向与读文本的方向一致。Windows提供了函 数SetViewportOrg和SetWindowOrg 用来设置视口和窗口的原点。缺省的窗口原点和视口原点均为(0,0),可以改变;缺省的窗口范围和视口范围均为(1,1),不可改变。

度量映射方式MM_LOMETRIC、MM_HIMETRIC、MM_LOENGLISH、MM_HIENGLISH和MM_TWIPS
将1个逻辑单位映射为固定的实际单位,其中1twip等于0.0176mm(1/1440英寸)。其他映射模式对应的物理单位参见表1。设置了映射模式以
后,Windows自动设置了窗口及视口的范围,范围本身的值并不重要,但范围比是一个固定的值,对于MM_LOMETRIC,Windows计算范围比
xViewExt/xWinExt=0.1mm中水平像素的点数。

自定义映射模式MM_ISOTROPIC和MM_ANISOTROPIC两种映射模式允许程序员设置自己的窗口和视口范围。
MM_ISOTROPIC和MM_ANISOTROPIC的区别是所设置的x轴和y轴的的范围必须相同,而MM_ANISOTROPIC所设置的x轴和y
轴的的范围可以不同。isotropi的意思是“在所有方向相同”,anisotropic的意思正相反。自定义映射模式中窗口和视口的原点和范围都可以
改变,程序员可以设置自己需要的映射模式。函数SetWindowExt和SetViewportExt
用于改变窗口和视口的范围。下面的代码将1个逻辑单位映射成0.396mm(1/64英寸)。

SetMapMode(hDC,MM_ISOTROPIC);(WINCE不支持)

SetWindowExt(64,64);

SetViewportExt(hdc,GetDeviceCaps(hdc,LOGPIXELSX),GetDeviceCaps(hdc,LOGPIXELSY));

时间: 2024-10-23 15:27:12

逻辑坐标与设备坐标——全窗口坐标、屏幕坐标、客户区坐标的总结的相关文章

MFC光标移动到按钮上时编辑框显示时间,并显示光标的窗口位置和客户区位置

建立MFC应用程序 选择基于对话框 添加一个按钮三个编辑框,三个编辑框分别用来显示系统时间.光标在windows的位置.光标在client的位置. 将Button的captain改为Time,ID改为IDC_time. 点击 项目/类向导/成员变量/  , 为按钮和编辑框添加变量m_time,m_showtime,m_client,m_window,(方法有很多). 注意类别为control,变量类型分别为cbutton和cedit 在类向导里 点击消息 找到mousemove,双击, 以上红字

屏幕坐标系和窗口客户区坐标

屏幕坐标系和窗口客户区坐标系最明显的区别在于坐标原点,屏幕坐标系的坐标原点在整个屏幕的左上角,而窗口客户区坐标系的坐标原点在窗口客户区的左上角,通常这两个点是不重合的. 一 设备坐标和逻辑坐标 设备坐标(Device Coordinate)又称为物理坐标(Physical Coordinate),是指输出设备上的坐标.通常将屏幕上的设备坐标称为屏幕坐标.设备坐标用对象距离窗口左上角的水平距离和垂直距离来指定对象的位置,是以像素为单位来表示的,设备坐标的X轴向右为正,Y轴向下为正,坐标原点位于窗口

2算法:客户区坐标转换成屏幕坐标

//显示菜单 POINT point = { 0 }; //转换时需要POINT数据结构 point.x = LOWORD(lParam); //客户区坐标 point.y = HIWORD(lParam); //转换成屏幕坐标 ClientToScreen(hWnd, &point); //point.x //point.y 这两个坐标可以直接使用 来自为知笔记(Wiz)

Windows的三种坐标系:屏幕坐标系,非客户区坐标系,客户区坐标系

1. 屏幕坐标系:以屏幕的左上角为原点,如图所示GetWindowRect() 函数获得的 RECT 就是以屏幕坐标系算的. 2. 非客户区坐标系(窗口坐标系)包括标题栏的部分.GetWindowDC 返回的设备环境就是基于此坐标系,一般只在 WM_NCPAINT 消息中使用. 3. 客户区坐标系不包括标题栏,坐标的原点在标题栏下的客户区的左上角.BeginPaint 函数返回的设备环境是基于客户区坐标系的,只在 WM_PAINT 消息中使用,与 EndPaint 函数成对使用.GetDC 函数

窗口非客户区的绘制

1.根据需要,要改变nc区的大小. 响应WM_NCCALCSIZE可改变nc区的大小.关键在于lParam,msdn上说当wParam为True时, lParam为LPNCCALCSIZE_PARAMS的指定,当wParam为False时为LPRECT,做了些实验发现 只有第一次时wParam为False,LPNCCALCSIZE_PARAMS的语义相当复杂,不过我们只用 看第一个RECT就成.它表是窗口客户区的大小.当lParam为LPRECT时,也同样.只用改变 客户区的大小,相应的就改变了

EVT_NC_PAINT 窗口非客户区的绘制

说明 NC就是non client意思,非客户区主要包括标题栏,状态栏,工具栏和边框等区域,目前wxwidgets只是提供了EVT_NC_PAINT 唯一的一个非客户区的事件,在MFC中,还有提供WM_NCLBUTTONDOWN WM_NCLBUTTONUP WM_NCMOUSEMOVE等事件操作,如果需要关联这些事件,就必须要过滤该事件,或者在源码中实现该类事件 目前需要拖动边框的时候,客户区域不变,只是边框变大,等到边框拖动到合适的地方,鼠标弹起,客户区域重绘

Windows客户区窗口大小设置

#define WINDOW_WIDTH 800 #define WINDOW_HEIGHT 600 Windows下设置的窗口(非客户区)长宽分别为800 x 600 所以当我们用函数GetClientRect(hwnd, &rect)获取客户区大小 rect.right为782   rect.bottom为555 所以如果要设置客户区成800 x 600 RECT rect1;RECT rect2;GetWindowRect(hwnd, &rect1);   // 四个坐标分别表示窗口

OpenGL超级宝典总结(二)2D/3D笛卡尔坐标、坐标裁剪、纹理坐标、MVP转换等概念

如果你想把图形渲染在正确的位置上,那么坐标的设置就很重要了.在OpenGL中,与坐标相关的主要有笛卡尔坐标.坐标裁剪.纹理坐标.MVP(Model View Projection)转换. 1.笛卡尔坐标 在二维绘图中,笛卡尔坐标有一个X轴和一个Y轴组成,X轴为水平方向,Y轴为垂直方向,X和Y相互垂直.如图1.关于正负方向问题,默认如图1上标示,但是我们可以根据实际需求自己定义.(左下角为(0, 0)原点) 图1: 在三维绘图中,笛卡尔坐标多了一个Z轴,Z轴同时垂直于X和Y轴.Z轴的实际意义代表着

windows编程笔记(5):客户区输出字符

在客户区的界面显示程序是在放在回调函数的WM_PAINT消息的处理中,当客户区需要被重绘时,Windows系统会给应用程序窗口发送一个WM_PAINT消息.窗口在收到这个消息时,它就会重绘它的客户区. 显示文字的步骤: 1 用BeginPaint()函数得到客户区的设备环境句柄. 2 用TextOut()函数显示文字. 3 用EndPaint()函数结束显示. 显示文字的代码如下: case WM_PAINT: hdc=BeginPaint(hWnd,&ps); TextOut(hdc,10,1