您的位置:首页 > 其它

GDI映射:设备坐标与逻辑坐标

2018-02-01 08:31 691 查看
1.    设备坐标,对显示器而言就是屏幕,其单位是像素;对打印机而言就是打印机的像素点。这个坐标与具体的设备相关,所以叫设备坐标。目前用到的就是显示器的像素。显示器的设备坐标有三种:屏幕坐标,窗口坐标,客户区坐标。

①    屏幕坐标:以整个屏幕为显示区,屏幕左上角为(0,0)点,x值向右增加,y值向下增加。

②    窗口坐标:以运行程序的整个窗口(客户区+标题栏等)为显示区,窗口左上角为(0,0)点,x值向右增加,y值向下增加。

③    客户区坐标:以运行程序的客户区为显示区,客户区左上角为(0,0)点,x值向右增加,y值向下增加。

非GDI函数以及部分GDI函数永远使用设备坐标。

2.    逻辑坐标,即文档坐标系,绝大部分GDI函数使用的都是逻辑坐标。

如:

MoveTo(int x,inty);

LineTo(int x,inty);

这两个函数的参数x,y用的都是逻辑坐标。可以这样说:牵扯到坐标的GDI函数,几乎全都是使用逻辑坐标。

平时使用这些GDI的时候,都是用像素来绘制的,这与设备坐标是一致的,看上去好像就在使用设备坐标一样。实际上,这是因为逻辑坐标与设备坐标有一个转换关系,默认的转换关系为MM_TEXT,在这个默认的转换关系下,逻辑坐标与设备坐标是相同的。此时1个逻辑单位就代表1个像素,逻辑坐标的原点与当前设备环境上下文的原点相同。

但逻辑坐标与设备坐标终究是两个坐标系,这两个坐标系之间的映射关系由系统负责处理。默认使用MM_TEXT映射关系,也就是1:1的映射关系。除此之外,Windows还提供了另外7种映射方式,其中第六种与第七种映射关系允许用户自定义映射的单位大小。

逻辑坐标的单位可以由用户任意定义,当然定义完成后要用映射关系函数将1个逻辑单位代表多少个像素告诉系统。然后一切的绘制操作都是使用逻辑坐标,系统就会自行按照映射关系转换为设备坐标输出到显示器上。一般来说逻辑坐标都会使用物理尺寸或是像素,若使用物理尺寸,如mm,就需要告诉系统1个逻辑单位代表多少个像素,也就是1mm代表多少个像素。

不仅1个逻辑单位映射到多少个像素是可以更改的,逻辑坐标的原点也是可以更改的。逻辑坐标原点默认与设备坐标原点重合。更改之后,系统会将逻辑坐标的原点(0,0)映射到设备坐标(a,b),然后进行逻辑单位与像素之间的映射。

在逻辑坐标上绘图,然后在设备坐标上表现。这就相当于凭空(逻辑坐标)构建一副图,然后将这幅图按照规则平移缩放,绘制在画板(设备坐标)上。

比如,使用默认MM_TEXT,在逻辑坐标系的(10,0)到(20,0)之间画一条直线。系统会按照1:1将其转换为设备坐标,逻辑坐标与设备坐标原点重合,体现在显示器上就是在像素点(10,0)到像素点(20,0)之间画一条线。

但若自定义逻辑坐标,令其原点映射为设备坐标(0,0),1个逻辑单位=10个像素。同样是在逻辑坐标系的(10,0)到(20,0)之间画一条直线。那么该直线在显示器上的表现是:像素点(100,0)到像素点(200,0)之间画一条线。

若将上面的自定义逻辑坐标原点映射为设备坐标(10,0),其他映射都相同,那么该直线在显示器上的表现是:像素点(110,0)到像素点(210,0)之间画一条线。

 

总之,显示器显示的必然是像素,要显示必然是使用设备坐标。但设备坐标从来都不用手动输入,手动输入、操作以及GDI函数所使用的参数都是逻辑坐标。

 

一副图像,要显示在屏幕上,比如调用了BitBlt()函数,那么BitBlt()函数中传入的图像宽、高、ROI等参数都是逻辑坐标。将这幅图画在逻辑坐标系中,然后剩下的映射工作系统会自动完成,将逻辑坐标转换为设备坐标,显示在屏幕上。

所以,首先要处理好图像坐标与逻辑坐标的关系,将图像要显示的部分显示在逻辑坐标系中指定区域即可,其他工作交给系统去做。

 

       注意:设备坐标系原点一直是在当前环境设备上下文的左上角的(虽然可以更改,但一般不会那么做,都是使用默认的左上角),x值向右增加,y值向下增加。但逻辑坐标系是不一定的。逻辑坐标系不仅原点映射与单位映射都可以改,其x与y的增加方向也可以改。

       有些对屏幕取点等的函数操作获取的是屏幕坐标,也就是设备坐标,若此时设备坐标与逻辑坐标是1:1关系,那么可以直接拿来当逻辑坐标用;但若此时设备坐标与逻辑坐标并非1:1关系,就需要进行转换,将设备坐标转换为逻辑坐标。

        逻辑坐标可以使用物理尺寸,世界坐标也可以使用物理尺寸。但这二者是不同的。比如1逻辑单位=5mm。一条10mm长的直线,对于逻辑坐标系而言就是2个单位,但对世界坐标系而言就是10个mm单位。

        另外,就算是使用MM_TEXT转换关系,设备坐标与逻辑坐标也未必是一致的,可能二者的原点是不同的。比如窗口有滚动条的情况。因为设备坐标是用于显示的区域,所以就算滚动条滚动,设备坐标也不变;但逻辑坐标是系统用于记录的坐标,滚动条滚动后,逻辑坐标就会改变,从而与设备坐标不一致。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: