Windows的GDI映射方式,逻辑坐标,设备坐标的接头

如今在学Win3二的编程,看的是《Windows程序设计第肆版》1书,那本书是新疆人翻译的,有个别译法和陆上不均等,书中还有局地荒谬的地点,很多时候供给中国和英国文对照阅读,下载请点击

TextOut(hdc,100,100,TEXT(“Love China”),10)

那句GDI函数的功用是在坐标点(十0,100)的职分输出贰个“LoveChina”字符串:

manbetx手机网页版 1

GDI函数作为硬件装备(显示屏,打字与印刷机)的接口封装中间层,其扩散的参数坐标值(十0,100)要在装置上哪些岗位显得,是通过GDI映射方式定义的!也正是说:

(100,100)
—————-通过措施A映射之后,能够变成—————-》(一,1)

(100,十0)
—————-通过艺术B映射之后,能够改为—————-》(10,一)

(十0,十0)
—————-通过艺术C映射之后,能够变成—————-》(一,叁)

manbetx手机网页版,(拾0,100)
—————-通过措施C映射之后,能够改为—————-》(5,壹)

左侧那一列的坐标(100,100)正是三个 style=”color: #玖b00d三; font-size: large;”>逻辑坐标(全数GDI函数都以)

左边这壹列的坐标(一,一)正是3个 style=”color: #玖b00d三; font-size: large;”>设备坐标

style=”color: #ff0000;”>所谓映射,正是将1个值通过三个数学公式变成别的1个值

https://download.csdn.net/download/u013238941/10611720

以下是WINDOWS定义的各个映射方式

好了,下边开头正文:

style=”color: #666666;”>“在私下认可情状下,WINDOWS的坐标原点在(0,0)点,然而足以经过调用SetWindowOrgEx来改变逻辑坐标点的原点,通过SetViewportOrgEx来改变设备坐标的原点;要是传入的参数有负号,还是可以够改变对应轴的正方向;X轴的正方向指向荧屏的出手,差别的炫耀格局Y轴正方向不等同”

MM_TEXT                      一个逻辑单位映射成1个像素     
Y:指向荧屏下侧

MM_LOMET大切诺基IC            
一个逻辑单位映射成0.壹mm        Y:(以下都针对上侧)

MM_HIMETCR-VIC             
2个逻辑单位映射成0.0一mm              

MM_LOENGHLISH        
一个逻辑单位映射成0.0一英寸

MM_HIENGLISH           
四个逻辑单位映射成0.00壹英寸

MM_TWIPS                  
四个逻辑单位映射成1/1440英寸

style=”background-color: #000000; color: #ffffff;”>MM_ISOTROPIC            
一个逻辑单位映射成自定义的装置单位

style=”background-color: #000000; color: #ffffff;”>MM_ANISOTROPIC       
三个逻辑单位映射成自定义的设施单位

style=”background-color: #ffffff; color: #000000;”>“天蓝背景的照射情势能改变逻辑坐标(也叫窗口)可能装备坐标(也叫视口)的限制

 
区别之处:

style=”background-color: #000000; color: #ffffff;”> style=”background-color: #ffffff; color: #000000;”>MM_ISOTROPIC在装置限制时WINDOWS将电动调整使得, style=”color: #ff0000;”>逻辑坐标的X与装备坐标的X之比=逻辑坐标的Y与设施坐标的Y之比

style=”background-color: #000000; color: #ffffff;”> style=”background-color: #ffffff; color: #000000;”>MM_ANISOTROPIC
不会调整 style=”background-color: #ffffff; color: #000000;”>”

在看到GDI(GDI Graphic Device
Interface图形设备接口)
照耀方式那1节的时候,书中又是逻辑坐标,又是装备坐标,又是视口,窗口,又是视埠什么的,搞得人头都大了。尽管本人未来还尚未完全读懂,可是小编感到笔者早就掀起了明白那几个事物的主线,上边的东西就视作本身的笔记吧:

manbetx手机网页版 2

一.逻辑坐标和设施坐标

要在相距窗口右边距拾0像素,上面距十0像素的地点写出2个I love you,
China能够应用如下提供的各个

Setmapmode(dc,MM_TEXT);
SetViewportorgEx(dc,100,100,nil);
逻辑坐标(0,0)对应装备坐标(100,拾0)

textout(dc,0,0,’I love you, China’,17);

manbetx手机网页版 3

 

Setmapmode(dc,MM_TEXT);
SetWindowOrgEx(dc,100,100,nil);

逻辑坐标(100,拾0)对应装备坐标(0,0)
textout(dc,200,200,’I love you, China’,17);

 

Setmapmode(dc,MM_LOMETRIC);
textout(dc,356,-356,’I love you, China’,17);

 

Setmapmode(dc,MM_HIMETRIC);
textout(dc,3560,-3560,’I love you, China’,17);

Setmapmode(dc,MM_LOENGLISH);
textout(dc,140,-140,’I love you, China’,17);

Setmapmode(dc,MM_ISOTROPIC);
SetwindowExtEx(dc,getclientRect.Right,getclientrect.Bottom,nil);
SetViewportExtEx(dc,getclientRect.Right,-getclientrect.Bottom,nil);
textout(dc,100,100,’I love you, China’,17);

 

Setmapmode(dc,MM_ANISOTROPIC);
SetwindowExtEx(dc,getclientRect.Right,getclientrect.Bottom,nil);
SetViewportExtEx(dc,getclientRect.Right,getclientrect.Bottom,nil);
textout(dc,100,100,’I love you, China’,17);

 
 首先,逻辑坐标这么些名词就让很三个人心惊肉跳,确实,不能够“一面之识”地知道的翻译就不是好翻译 
 ——周树人。哈哈,开个玩笑,我们要清楚这七个东西,首先要想开借使您要用Win3贰要绘制二个事物,该咋办呢?比如绘制八个矩形,就算我们调用的是Rectangle(hdc,30,20,50,80),(那几个函数的用法是Rectangle(hdc,left,top,right,bottom),笔者叫雷锋同志,不用谢笔者)。能够看来,跟很多GDI函数1样,这些函数里面使用了许多数字,坐标。让我们回想一下完全小学文化,绘制一个事物,不仅应该搞精晓他的长短,还应该搞精通他的单位,那么那里的30,20,50,80的单位是如何吗?很多人会说,是像素!那一个答案是对的,不过又不全对。事实上,Windows暗许的投射方式(Mapping
Mode,简称便是MM)是MM_TEXT,在MM_TEXT映射格局(TEXT实际上跟文字未有多大关系,是那种映射情势下的坐标方向,从左到右,从上到下,跟文字阅读格局一样)下,那些单位确实是像素。实际上,逻辑坐标和配备坐标的分裂就在于他们的单位不均等!

下边我们拿出贰个公式

         
 manbetx手机网页版 4

要讲上面包车型地铁公式,就要先说一下视口(Viewport 新疆译作视埠)和窗口(Window
湖北译作视窗)

先是,不要被那七个名字吸引了,那五个坐标是跟映射有关的,跟显示屏坐标系,窗口坐标系,客户端坐标系是相对独立的八个文化。

实则公式拿出来,学数学的同伙是否就懂了大约了,这么些公式相当首要,通晓了那个公式,前边的过多东西就能明白,首先,公式中的Window,WinOrg,WinExt,便是带了Win的事物,便是利用的逻辑坐标的值,就跟GDI函数中的1样,逻辑坐标的单位只怕是像素(MM_TEXT映射)、毫米(单位是0.1mm,在MM_LOMETWranglerIC映射下)等等等等(看下图).

manbetx手机网页版 5

正是说大家在调用Win32函数绘图的时候,要明了自身使用的单位(根据映射情势规定的)。因为绘图函数里的数值,使用的就是那几个单位,尽管暗中同意的MM_TEXT映射情势应用的单位尽管像素,可是不少时候任何单位也很有用,比如你要做3个荧屏尺子的时候,你要用尺子量一下实体有几分米。尺子上的刻度就能够用此外的投射格局来画。但是荧屏在呈现的时候却无法只知道逻辑坐标几分米啊,显示屏得了然具体的像素地点才行啊!那那年,就要求选拔上面包车型大巴公式转换了。讲到那里,公式里的ViewExt/WinExt是如何看头就很强烈了。那就是在时下逻辑坐标系下(比如几分米,打比方哈),实际上是地点映射情势表格里的单位)对应的设施坐标应该是不怎么个像素!那样转换之后,获得实在的Viewport,便是该逻辑点在显示器上的任务。

所以说视口和窗口实际上是象征的1致块区域,只可是是因为单位和原点的不等,要求开始展览映射,逻辑单位便是窗口,正是Window,正是像素,分米,英寸,就是给人用的单位,就是装备无关的单位,设备单位就是视口,正是Viewport,就只好是像素,正是给装备用的单位,显明的一毫米,在差别的设施上的像素数或然会有分别,所以是装备相关的单位。

 

要留意的是在上述的伍映射格局下,ViewExt/WinExt的百分比都以早就明确了,不能够更改的,假使要转移七个值,只可以在MM_ISOTROPIC和MM_ANISOTROPIC映射形式下行使SetViewportExtEx()和SetWindowExtEx()更改。而且那八个函数在上面五种炫耀格局下无效。

最终,那些映射形式,视口原点(ViewOrg),窗口原点(WinOrg)等,都是装备内容(DC
Device
Context,又译作装置内容、设备上下文等)的属性,设备内容其实正是您绘制的区域。有三种BeginPaint(在WM_PAINT时绘制无效区域),GetDC是客户端区域(在更新时绘制整个客户区域),GetWindowsDC是漫天窗口区域(能够绘制蕴涵窗口题目栏,菜单栏区域)。这一个知识细讲的话又是另壹篇博客了

 

 

由此只要记住开始的公式,获得不错的对应的参数,就能够画出必要的图样。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图