45fan.com - 路饭网

搜索: 您的位置主页 > 电脑频道 > 电脑教程 > 阅读资讯:如何使用windows打印预览缩放和映射模式?

如何使用windows打印预览缩放和映射模式?

2016-09-04 06:30:29 来源:www.45fan.com 【

如何使用windows打印预览缩放和映射模式?

本文是笔者2001年用Delphi做打印及预览时做的笔记,现在整理以前文档时发现了,贴上来做个纪念。

缩放方法和映射模式
几个重要的单位:
1 inch 英寸=25.4 millimetres 毫米
1 point 磅 = 1/72 inch英寸
1 twip缇 = 1/20 point 磅
1. 映射模式——视口(Viewport)和窗口(Window)坐标
映射模式决定Windows如何把GDI中指定的逻辑坐标转换或映射为特定设备的坐标,也就是说,映射模式决定窗口或逻辑坐标如何转换为视口或设备坐标。
在Windows中,视口坐标是特定的设备坐标并以像素为单位,窗口和逻辑坐标则是映射模式以逻辑单位的形式指定的,它有适合于本模式的原点和坐标轴方向。
描述表(content)映射模式表达了控制绘图操作的大多数基础属性。窗口和视口原点以及窗口和视口的范围(extent)是紧密相关的。原点是指点(0,0)的位置,而相关方向是沿着X轴和Y轴坐标值递增的方向。范围是指当逻辑坐标转换为物理坐标或像素时要进行的固有的缩放操作。
具体模式和转换通过SetMapMode,查阅相关Help。
int SetMapMode(
HDC hdc, // handle of device context
int fnMapMode // new mapping mode
);
2. 改变原点
X视口 = X窗口 – X窗口原点 + X视口原点
Y视口 = Y窗口 – Y窗口原点 + Y视口原点
SetViewportOrgEx]
3. 改变范围或缩放比例
只在在两种可缩放的各向同性模式下才能改变;所有其它模式下,缩放因子是一个预定的常数。
SetWindowExtEx
SetViewportExtEx
4. 映射模式和舍入误差
舍入误差通常在一个逻辑单位不等于设备单位时发生,如果应用程序请求GDI执行一个支导致非整数像素的操作时也会引入舍入误差。这些误差有时可忽略,有时则要处理。
对于所有的映射模式,Windows把逻辑坐标变为设备坐标的完整公式为:
x_device= (x_logical – x_window_origin) * x_viewport_ext / x_window_ext + x_viewport_origin
y_device= (y_logical – y_window_origin) * y_viewport_ext / y_window_ext + y_viewport_origin
用LPToDP转换。注:个人理解,设备坐标就是视口坐标。
反向公式:
x_window= (x_device – x_viewport_origin)*x_window_ext / x_viewport_ext + x_window_origin
y_window= (y_device – y_viewport_origin)*y_window_ext / y_viewport_ext + y_window_origin
用DPToLP转换。
5. 计算磅值大小
为了强制屏幕匹配打印页,创建一个屏幕各打印机设备描述表(DC),并在每个DC可显示字体中进行选择,如无合适字体则创建字体。
屏幕通常不是打印页的精确匹配,为了获得最好的WYSIWYG效果,根据打印机设备描述表的规格对所有的页进行排版计算,强制和屏幕输出相匹配。
在计算时会用到API函数:
int MulDiv(
int nNumber, // 32-bit signed multiplicand
int nNumerator, // 32-bit signed multiplier
int nDenominator // 32-bit signed divisor
);
字高的计算:
Height = - (PointSize * GetDeviceCaps(hdc, LOGPIXELSY) / 72)
PointSize:表示字体的磅数
MM_TEXT对屏幕支持很好,但对打印机支持不是很好。
MM_TWIPS模式对打印机设备支持很好(因为它基于真正的英寸)但对屏幕的支持并不是很好。但可使用下面的方法等效使用。
SetMapMode(hdc,MM_ANISOTROPIC);
SetWindowExtEx(1440,1440);
SetViewportExtEx(GetDeviceCaps(hdc,LOGPIXELSX),
GetDeviceCaps(hdc, LOGPIXELSY));
在公制单位的打印操作中使用另一种模式:
采用MM_HIMETRIC(单位:0.01mm)和MM_LOMETRIC(单位:0.1mm)系统中的量制时:
x_device= MulDiv(x_himetric, GetDeviceCaps(hdc, LOGPIXELSX), 2540)
x_device= MulDiv(x_lometric, GetDeviceCaps(hdc, LOGPIXELSX), 254)
 

本文地址:http://www.45fan.com/dnjc/71993.html
Tags: 打印 windows 预览
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部