我在Delphi XE应用程序中遇到元文件渲染问题。
问题是当我渲染元文件时,文本太大了。 Irfanview和FastReports就像这样:
windows 7 Paint渲染效果很好:(这是文本应该是什么样子)
任何想法导致了什么?
谢谢!
答案 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 + 中。这是某种怪物"格式,由您的第三方库创建。
我建议如下:
emf
文件
emf
到emf+
转换器API。对于使用GDI +,请查看开源SynGdiPlus unit:它将为您生成的位图添加GDI +反对。它可以将emf
转换为emf+
。它将使用原生的Vista / Seven API(就像Windows 7绘图)或Windows XP下的普通Delphi代码。
答案 1 :(得分:1)
原因可能是显示器尺寸和屏幕分辨率不同。 GDI具有参数HORZRES
,HORZSIZE
,VERTRES
,VERTSIZE
。在大多数情况下HORZRES/VERTRES
,HORZSIZE/VERTSIZE
(分辨率和屏幕比率)是相同的,一切运行良好......但是如果它们不同(我在服务器上发现了一些这样的例子)那么假设像素为矩形,这会导致LOGFONT.lfWidth
“错误地”计算。 LOGFONT.lfWidth
确定字符的宽高比,这最终会导致奇怪的字母。
一种解决方案是更改分辨率,以便HORZRES/VERTRES
,HORZSIZE/VERTSIZE
匹配。另一种解决方案是使用打印机DC来渲染您的东西。明确设置LOGFONT.lfWidth
值可能会有所帮助。同时更新视频驱动程序可能有所帮助。
我遇到了同样的问题,我临时绘制到使用GetDC(0)
作为参考而不是打印机DC的图元文件画布。以下是一些具有相同问题的链接:
答案 2 :(得分:0)
有点赌博,但是:
可能与Vista +中的新系统字体有关,那是Delphi的新支持吗?如果在移植过程中发生这种情况,请在旧版本和新版本中修复tmetafile中使用的字体。