|
2
|
| Mike Spross Alex Martelli · 技术社区 · 15 年前 |
|
1
1
GetTextMetrics接受DC。它使用来自该DC的DPI设置(例如,您不可能使用屏幕设置,并且希望数据输出的格式能够被打印机接受)。
所以你所需要做的就是给一个直流电提供合适的dpi。
元文件是矢量图形,所以它们看起来甚至不像有dpi。
你可以用
或者您可以使用gdi+,创建一个具有所需dpi的位图,使用对图像进行操作的图形构造器,然后图形将具有正确的dpi,这样gdi+文本测量函数将使用您选择的dpi。 |
|
|
2
1
我找到了一个更简单的解决方案。我花了一段时间才让自己相信这确实有道理。解决方案是如此明显,我觉得在这里张贴它几乎是愚蠢的。 最终,我真正想要的是 FITTEXTCTRIECT 函数生成相同的文本布局 任何 DPI设置。事实证明,为了做到这一点,事实上 更容易的 以像素为单位测量所有内容。因为根据定义,任何其他度量单位都将考虑当前的dpi设置,使用像素以外的任何其他度量单位都可能导致问题的发生。 接下来的“诀窍”是强制所有的计算得出与96 dpi时相同的结果。但是,如果临时缩放 字体大小 在计算任何文本范围之前向下。请注意,原始字体大小仍在打印预览和打印输出中使用。 这是因为Windows内部在 设备单元 对于屏幕,表示像素。字体的“点大小”由允许您使用当前dpi设置选择字体的应用程序转换为像素:
也就是说,Windows从不直接处理字体的点大小:它总是处理像素。因此,它也会根据像素计算文本范围。 这意味着您可以根据当前dpi和字体点大小计算比例因子,该比例因子将字体缩小到新的点大小,在任何dpi上始终达到相同的像素数(我使用96作为“基线”dpi):
通过有效地强制字体在任何dpi上适应相同数量的像素,这可以确保文本范围在任何dpi上都是相同的,因此算法将在任何dpi上以相同的方式排列文本。 我唯一需要做的是确保传递给函数的高度和宽度参数(以英寸为单位)正确转换为像素。我不能使用vb6现有的英寸到像素的转换函数,因为它考虑到了当前的dpi(这会产生不一致的结果,因为文本的高度和宽度是“标准化的”到96dpi),所以我只是将高度和宽度乘以96,将它们转换为其像素测量值为96dpi。 |
|
|
committedandroider · 如何区分平板电脑和手机上的dpis? 12 年前 |
|
|
user1750948 · 如何在labview中查找显示器的dpi 13 年前 |
|
|
Herrozerro · 让WPF应用程序忽略DPI设置 13 年前 |