渲染元文件时,文本太大

时间:2012-01-09 19:58:21

标签: delphi

我在Delphi XE应用程序中遇到元文件渲染问题。

问题是当我渲染元文件时,文本太大了。 Irfanview和FastReports就像这样:

look at the text to the left of the graph

windows 7 Paint渲染效果很好:(这是文本应该是什么样子)

windows 7 Paint renders it fine

任何想法导致了什么?

谢谢!

3 个答案:

答案 0 :(得分:4)

emf文件只是GDI命令的列表。事实上,他们可以回放"很容易被系统使用标准的Windows GDI命令(在Delphi中,TMetaFile只是这些API的包装器。)

IrfanView FastReport 呈现图元文件内容时,它们只使用Windows GDI相应的命令。当 Windows 7 Paint 呈现图元文件内容时,它使用GDI +渲染器。我甚至认为它会在内部将emf文件转换为emf+格式,然后使用GDI +进行反混淆。

因此,如果emf文件在 IrfanView FastReport 中呈现错误,我怀疑这是因为您的元文件格式不正确:第三方图形引擎你正在使用的是生产非标准电动车。可能的问题是目标系统中缺少使用的字体,并且GDI不会用GDI +替换字体。

另一种可能性是emf文件可能是格式:它包含emf格式(未正确创建,因此无法使用GDI正确呈现)和emf+格式(使用GDI +按预期呈现)。通常,此 emf/emf+格式不应存在:即使官方GDI +库也不允许将其图元文件内容保存在 emf + 中。这是某种怪物"格式,由您的第三方库创建。

我建议如下:

  • 使用EmfExplorer;
  • 下载并检查您的emf文件
  • 尝试使用GDI +渲染元文件;
  • 尝试使用emfemf+转换器API。

对于使用GDI +,请查看开源SynGdiPlus unit:它将为您生成的位图添加GDI +反对。它可以将emf转换为emf+。它将使用原生的Vista / Seven API(就像Windows 7绘图)或Windows XP下的普通Delphi代码。

答案 1 :(得分:1)

原因可能是显示器尺寸和屏幕分辨率不同。 GDI具有参数HORZRESHORZSIZEVERTRESVERTSIZE。在大多数情况下HORZRES/VERTRESHORZSIZE/VERTSIZE(分辨率和屏幕比率)是相同的,一切运行良好......但是如果它们不同(我在服务器上发现了一些这样的例子)那么假设像素为矩形,这会导致LOGFONT.lfWidth“错误地”计算。 LOGFONT.lfWidth确定字符的宽高比,这最终会导致奇怪的字母。

一种解决方案是更改分辨率,以便HORZRES/VERTRESHORZSIZE/VERTSIZE匹配。另一种解决方案是使用打印机DC来渲染您的东西。明确设置LOGFONT.lfWidth值可能会有所帮助。同时更新视频驱动程序可能有所帮助。

我遇到了同样的问题,我临时绘制到使用GetDC(0)作为参考而不是打印机DC的图元文件画布。以下是一些具有相同问题的链接:

答案 2 :(得分:0)

有点赌博,但是:

可能与Vista +中的新系统字体有关,那是Delphi的新支持吗?如果在移植过程中发生这种情况,请在旧版本和新版本中修复tmetafile中使用的字体。