GDI映射模式总结

GDI是我发现比较麻烦的一个东西了.看了Windows程序设计,虽然描述很清楚,但还让我们难以理解.最让人麻烦的就是窗口和视口的概念了.其实,本质就是设备和显示的关系.把我理解的写在下面!希望指正.

 

1.设备,设备就是Device,有显示器,打印机,等,这些硬件都是设备.都可以提供图形显示功能,这些就是设备.设备用 像素或者称为点来描述显示能力:比如1024*768像素,打印机用的是DPI,就是每个英寸可以显示的点数.比如针式打印机为180*180,这个纵横比例就说明了打印的能力,180DPI.喷墨,激光打印机可能是1200DPI,6000DPI. 我们在何处显示呢?那要告诉打印机/显示器,在 第几个像素显示,这就涉及到一个坐标问题.设备有一个直角坐标系,在屏幕或者打印机的左上角.为0,0坐标.每个像素(点)为一个单位.

 

2.窗口.在Windows显示器中,称为窗口,在打印上,就是纸张.实际上就是你看到的东西.我们可以使用设备的单位(点,像素),但我们一更换不同分辨率的打印机,发现打印的大小不同.这就是因为在每个英寸上的点(显示能力,DPI)不同导致.为了帮助我们使用,Windows提供了映射模式.可以让我们以我们现实中的单位(逻辑单位)来定义我们的图形行为(打印或者显示).比如,我喜欢使用毫米.那么我定义映射模式的单位为毫米,这样我的图形行为在任何设备上输出,都保证是毫米的了.到底该用多少像素,GDI帮我们作了.否则我们就要自己进行判断,计算.

 

3.难以理解的事情是因为概念的原因. 即视口,视口就是设备,窗口就我们可以看到的东西.记住了就是理解!

 

4.既然有了窗口,我们可以在窗口上进行绘图,输出文字了.这些都是逻辑上的,也就是我们要看到的.我们还要告诉显示设备,让设备知道我们的单位换算关系,位置对应关系. 单位换算关系就是将一毫米转换多少像素的问题.位置对应关系就是坐标怎么对应.Windows可以让你对应多种坐标系.

 

5.怎么决定换算单位:其实就是一个显示能力的问题.比如显示器,96DPI,每英寸96点.那么 一英寸=25.4毫米,即每毫米3.78个像素.呵呵,当然,Window肯定不能显示半个像素.这样,同样是 25.4毫米,在我们的显示器上就是96点,而在打印机上就是180点.这样换算没有问题了. 可以认为,在使用毫米单位时,在96DPI的能力中,这个换算因子是3.78.

 

6.怎么决定位置对应关系.首先,假设原点相同.这样位置对应关系就变成单位换算了.呵呵.那么,原点不同,就在加上个偏移量.

 

7.换算单位可以用范围来指定.这也是个不好理解的地方,比如,在MM_TEXT模式下,1:1,就是说设备和窗口的范围都是1,那么两个单位一致.而在使用毫米单位时呢,显示器就是 254:96, 打印机可能是254:180,当然,还可以为实际的范围比例.

即使用 SetWindowExtEx 设定显示范围大小; 用SetViewportExtEx设定设备范围大小.

 

 

最后把常用的单位换算写下来:

     1 inch 英寸=25.4 millimetres 毫米
     1 point 磅 = 1/72 inch英寸
     1 twip缇 = 1/20 point 磅

 

我目前使用的映射模式:
SetMapMode(hdc,MM_ANISOTROPIC);
SetWindowExtEx(254,254);
SetViewportExtEx(GetDeviceCaps(hdc,LOGPIXELSX),GetDeviceCaps(hdc, LOGPIXELSY));

 

我发现,显示和打印不是特别美.原因是缩放转换中,导致四舍五入的结果.下一步,我打算用一个更大的单位来满足需要.

 

 

祝学习愉快!

 

你可能感兴趣的:(设计模式,windows)