设备坐标和逻辑坐标

来源:互联网 发布:radon内核优化项目 编辑:程序博客网 时间:2024/05/22 18:02

个人理解 : 这里指定客户区坐标系统,而非屏幕坐标或者窗口坐标系统。
设备坐标指物理设备的坐标系统,原点(0,0)一般都在左上角,因为设备坐标的间隔尺寸有可能是像素,mm 或者其它 ,所以程序员并不需要清楚设备的具体坐标表示,于是就发明了逻辑坐标。还有一点,客户区的坐标x轴往右增大,y轴往下增大。
逻辑坐标的产生完全是为了不必去考虑设备坐标的位置,能更统一的进行坐标标示,比如要定点 (100,100) 则直接用逻辑坐标的方式定到(100,100),这里就产生了这个(100,100)的坐标是怎么对应于设备坐标点的位置的问题。于是就有了逻辑坐标和设备坐标的对应关系 ,我们在进行逻辑坐标表示前,要先做好逻辑坐标和设备坐标之间换算的协议,简单点说就是os后台是根据什么公式将逻辑坐标点转换为对应的设备坐标点的。
win32下,一般先指定逻辑坐标的宽和高(自定义一个宽度和高度)用SetWindowExtEx,再指定设备坐标的宽和高(用api获得设备的真实宽和高)用SetViewportExtEx,【默认情况下将逻辑坐标的0,0 和设备坐标的0,0重叠的】,一般是左上角原点。
假设逻辑坐标的宽和高定义为100,100,那么 其意义为(0,0,100,100)这个矩形是物理设备可显示的(0,0,最大宽度,最大高度)这个可视矩形 ,我们如果 textout(hdc,100,100,TEXT("kkk"),nullptr);则这个kkk将输出在设备可视范围之外,就是说我们看不到了,可以用<100的坐标点,如 99,99这个点位来输出 kkk 还可以输出在设备可视范围之内。

但有时我们会用SetWindowOrgEx(hdc,50,50,nullptr);来重新绑定逻辑坐标(50,50)[注意这里的50,50,其实它是逻辑点,os 会根据我们之前协议好的转换协议将这个50,50转换为设备坐标的那个具体的点位 ,而且要注意是不能超出自定义的逻辑宽度和高度的]与设备坐标的(0,0)点对应 位置,此时就设置了逻辑坐标(50,50)对应到设备坐标的(0,0)位置了,当我们TextOut(hdc,0,0,TEXT("kkk"),nullptr);时(注意这个0,0也是逻辑坐标点)你在客户区就会发现输出的内容看不见了,这是因为逻辑坐标点(0,0)已经在设备坐标(0,0)点的左上角偏移过去了,所以输出时并没有输出在我们的客户区范围内。

而当我们用SetViewportOrgEx(hdc,30,30,nullptr); 时,其真实意义为逻辑点(0,0)已经和转换后的(30,30)坐标点重叠了,设备坐标(0,0)左上角原点和逻辑坐标(-30,-30)重叠了。当我们TextOut(hdc,0,0,TEXT("kkk"),nullptr);输出内容时,输出位置在客户区的右下解方向偏移了一点。
1 0
原创粉丝点击