小编Ste*_*ere的帖子

在Win7中,某些字体不像在Win2K/XP中那样工作

我的问题是如何更改字体处理以便在Windows 7下正常工作.我确信我已经做过关于之前有效但不再有效的事情的假设.但我甚至不知道从哪里开始寻找!我在祈祷有人可以帮忙!以下是我了解它们的详细信息(我也在Microsoft Windows开发人员论坛上发布了这个问题,但他们没有回答):

是的,我的时间(赫克,我还是写在普通的C代码WIN32!)我有一个10岁的老DLL我写后面,模仿一个窗口的工作区域内的更老的DOS屏幕I/O库.不用说,它只允许使用固定宽度的字体.当一些使用DLL的程序被移动到Windows 7时,使用固定宽度的TRUE TYPE字体会出现奇怪的闪烁(位图字体仍能正常工作.)我们已将问题跟踪到事实写的单个字符ExtTextOut比它应该更宽.我已经用三种不同的方式检查了测量结果(通过使用GetTextExtentPoint32132个字符串并除以132,通过调用GetTextMetrics甚至使用GetCharABCWidths所有256个字符),他们都同意字体的宽度相同.但是ExtTextOut渲染背景矩形比字体宽度宽一或两个像素.无论是不是,或者它开始后台生成一个或两个像素的参数[我这样称呼它:给定位置的左边 ExtTextOut( hdc, r.left, r.top, ETO_OPAQUE, &r, &ch, 1, NULL ).]请记住,这个确切的代码工作完全的Windows 2000,Windows XP中,并与Windows 7上的位图字体 - 但在Windows 7下它不再适用于固定宽度的真实字体.

对于那些没有理解我需要做的事情的人:试着想象在一张方格纸上每个方格写一个字符.每个方块使用相同的字体,但可能具有不同的前景色和/或背景色.我使用TA_TOP|TA_LEFT文本对齐,因为它是最简单的,任何一致应用的对齐应该适用于固定宽度的字体.

我所看到的是ExtTextOut发出的背景矩形比我在RECT *参数中指定的更大.由于我提供的矩形是根据报告的字体大小创建的,所以这绝不应该发生 - 它在Windows XP及更早版本中从未发生过,并且在Windows 7下不会发生位图(即.FON)字体,无论是.但它总是在Windows 7下使用固定宽度的TrueType字体.这是在Windows 2000,Windows XP和Windows 7(32和64)上运行的EXACT SAME EXECUTABLE.虽然我只想说Windows 7有一个bug,我更倾向于相信我在Windows下对字体处理做出的一些基本假设已不再适用(在为Windows编写软件20年之后).

但我不知道如何或在哪里发现可能是什么!拜托,请帮帮我吧!

---修改---

对于任何有兴趣的人,我已经设法解决了我正在考虑的错误 - 直到我找到相反的文档.我的解决方法包括对库进行两处更改:

  1. 使用从GetTextExtentPoint32()'X' 返回的大小而不是来自的数据TEXTMETRICS.
  2. ETO_CLIPPING在所有ExtTextOut()呼叫中包含该标志.

以前,我正在使用tmHeight+tmExternalLeading连续文本行的顶部之间的像素数,如文档所述.我发现从那里回来的size.cy值GetTextExtentPoint32(不一样,看起来更准确.我找到的最糟糕的例子是OCRB真实字体.这是我在调试器中看到的我创建的OCRB字体(使用系统字体选择对话框):

ocrbtm.tmHeight          = 11
ocrbtm.tmExternalLeading =  7

ocrbsize.cy = 11 …
Run Code Online (Sandbox Code Playgroud)

windows fonts truetype font-size

7
推荐指数
1
解决办法
2555
查看次数

标签 统计

font-size ×1

fonts ×1

truetype ×1

windows ×1