【笨嘴笨舌WINDOWS】GDI映射格局

新近在学Win3二的编制程序,看的是《Windows程序设计第伍版》1书,那本书是四川人翻译的,有个别译法和六上不雷同,书中还有部分错误的地点,好些个时候须要中国和英国文对照阅读,下载请点击

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

那句GDI函数的效能是在坐标点(十0,100)的地方输出3个“LoveChina”字符串:

图片 1

GDI函数作为硬件配备(荧屏,打印机)的接口封装中间层,其扩散的参数坐标值(100,拾0)要在设施上哪个地方显示,是经过GDI映射方式定义的!约等于说:

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

(100,拾0)
—————-通过措施B映射之后,能够成为—————-》(10,一)

(100,100)
—————-通过措施C映射之后,能够形成—————-》(一,三)

(十0,100)
—————-通过措施C映射之后,能够改为—————-》(5,壹)

左手这一列的坐标(十0,十0)即是三个 style=”color: #玖b00d三; font-size: large;”>逻辑坐标(全部GDI函数都是)

右手那一列的坐标(1,①)就是二个 style=”color: #玖b00d三; font-size: large;”>设备坐标

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

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

以下是WINDOWS定义的各类映射情势

好了,上面初步正文:

style=”color: #66666⑥;”>“在私下认可意况下,WINDOWS的坐标原点在(0,0)点,但是能够通过调用SetWindowOrgEx来改换逻辑坐标点的原点,通过SetViewportOrgEx来改换设备坐标的原点;假使传入的参数有负号,还是可以够转移对应轴的方框向;X轴的正方向指向显示屏的右侧,不相同的投射方式Y轴正方向区别等”

MM_TEXT                      二个逻辑单位映射成3个像素     
Y:指向显示器下侧

MM_LOMET福特ExplorerIC            
贰个逻辑单位映射成0.一mm        Y:(以下都指向上侧)

MM_HIMETLX570IC             
3个逻辑单位映射成0.0一mm              

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

MM_HIENGLISH           
3个逻辑单位映射成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图形设备接口)
炫酷方式那一节的时候,书中又是逻辑坐标,又是装备坐标,又是视口,窗口,又是视埠什么的,搞得人头都大了。纵然本身后天还平素不完全读懂,可是本人以为自个儿曾经吸引了精通这一个东西的主线,下边包车型大巴东西就作为本人的笔记吧:

图片 2

1.逻辑坐标和配备坐标

要在相距窗口左边距拾0像素,下面距拾0像素的岗位写出三个I love you,
China能够采取如下提供的各类

Setmapmode(dc,MM_TEXT);
SetViewportorgEx(dc,100,100,nil);
逻辑坐标(0,0)对应道具坐标(拾0,十0)

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

图片 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);

 
 首先,逻辑坐标这些名词就让很多人望而生畏,确实,不能“以管窥天”地通晓的翻译就不是好翻译 
 ——周豫山。哈哈,开个噱头,大家要掌握那多个东西,首先要想到假设您要用Win32要绘制1个事物,该如何是好啊?比如绘制三个矩形,借使大家调用的是Rectangle(hdc,30,20,50,80),(这么些函数的用法是Rectangle(hdc,left,top,right,bottom),小编叫雷锋同志,不用谢作者)。能够见见,跟繁多GDI函数同样,那个函数里面使用了重重数字,坐标。让大家回想一下小学校文化,绘制一个事物,不仅应该搞通晓她的尺寸,还应有搞明白他的单位,那么那里的30,20,50,80的单位是何等呢?许多个人会说,是像素!那些答案是对的,可是又不全对。事实上,Windows暗中同意的炫彩方式(Mapping
Mode,简称正是MM)是MM_TEXT,在MM_TEXT映射形式(TEXT实际上跟文字未有多大关系,是那种映射形式下的坐标方向,从左到右,从上到下,跟文字阅读格局一样)下,这么些单位实在是像素。实际上,逻辑坐标和装置坐标的区别就在于他们的单位不平等!

上边大家拿出二个公式

         
 图片 4

要讲上边的公式,将在先说一下视口(Viewport 吉林译作视埠)和窗口(Window
黑龙江译作视窗)

第二,不要被那七个名字吸引了,这五个坐标是跟映射有关的,跟荧屏坐标系,窗口坐标系,客户端坐标系是周旋独立的四个文化。

实际公式拿出去,学数学的同伴是还是不是就懂了繁多了,这几个公式相当首要,精通了这些公式,前面包车型客车大多事物就能精通,首先,公式中的Window,WinOrg,WinExt,正是带了Win的事物,就是选用的逻辑坐标的值,就跟GDI函数中的同样,逻辑坐标的单位可能是像素(MM_TEXT映射)、毫米(单位是0.1mm,在MM_LOMET兰德酷路泽IC映射下)等等等等(看下图).

图片 5

说是大家在调用Win3二函数绘图的时候,要知道本中国人民银行使的单位(依据映射情势规定的)。因为绘图函数里的数值,使用的正是那么些单位,固然私下认可的MM_TEXT映射方式应用的单位就是像素,不过不少时候任何单位也很有用,比方你要做二个显示器尺子的时候,你要用尺子量一下实体有几毫米。尺子上的刻度就能够用此外的投射方式来画。可是显示屏在显示的时候却不可能只晓得逻辑坐标几分米啊,荧屏得领会具体的像素地方才行啊!那那个时候,就须求动用上面的公式调换了。讲到那里,公式里的ViewExt/WinExt是如何意思就很扎眼了。那正是在目前逻辑坐标系下(例如几分米,打比如哈),实际上是下面映射方式表格里的单位)对应的设施坐标应该是多少个像素!那样调换之后,获得实质上的Viewport,正是该逻辑点在显示屏上的岗位。

所以说视口和窗口实际上是象征的壹律块区域,只但是是因为单位和原点的不等,须要打开映射,逻辑单位便是窗口,便是Window,正是像素,分米,英寸,就是给人用的单位,正是设备无关的单位,设备单位就是视口,正是Viewport,就只可以是像素,就是给设备用的单位,分明的1分米,在区别的设施上的像素数恐怕会有分别,所以是设备相关的单位。

 

要注意的是在上述的5映射方式下,ViewExt/WinExt的比重都以曾经显著了,不可能改动的,假如要改成多少个值,只可以在MM_ISOTROPIC和MM_ANISOTROPIC映射方式下使用SetViewportExtEx()和SetWindowExtEx()更换。而且那七个函数在上头伍种炫酷格局下无效。

最后,这个映射方式,视口原点(ViewOrg),窗口原点(WinOrg)等,都以设备内容(DC
Device
Context,又译作装置内容、设备上下文等)的习性,设备内容实在正是你绘制的区域。有三种BeginPaint(在WM_PAINT时绘制无效区域),GetDC是客户端区域(在立异时绘制整个客户区域),GetWindowsDC是整套窗口区域(能够绘制包罗窗口标题栏,菜单栏区域)。那些文化细讲的话又是另壹篇博客了

 

 

所以即便记住开头的公式,获得正确的相应的参数,就足以画出必要的图片。

 

发表评论

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

网站地图xml地图