【问题标题】:System font does not work with OEM_CHARSET系统字体不适用于 OEM_CHARSET
【发布时间】:2021-07-24 19:01:34
【问题描述】:

我创建了一个非常简单的c++ win32 应用程序,并尝试使用以下字体设置绘制一些文本:

charset = OEM_CHARSET
pitch = FIXED_PITCH
name = L"System"

我这样创建字体:

CreateFont(16, 0, 0, 0, FW_REGULAR, false, false, false, OEM_CHARSET, OUT_RASTER_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FIXED_PITCH, L"System");

然后我在WM_PAINT 中画出这样的文字:

PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);

SelectObject(hdc, font);
TextOut(hdc, 100, 200, L"wiw", 3);

EndPaint(hWnd, &ps);

但是,绘制的文本是Consolas 字体,而不是System 字体。 问题是,如果我将OEM_CHARSET 更改为DEFAULT_CHARSET,则使用正确的字体System 绘制文本。

这是 with OEM_CHARSET 绘制的文本(即不工作):

这是绘制的文本没有 OEM_CHARSET(即工作,但我需要OEM_CHARSET设置):

我需要设置OEM_CHARSET 的原因是因为我试图复制this,而答案指出OEM_CHARSETFIXED_PITCHSystem 是必需的。

我的问题是:

  1. 为什么OEM_CHARSET 用完全不同的字体呈现System 字体?
  2. OEM_CHARSET 还能做什么?文档只是说明它以不同的方式映射字符,但我使用的是普通的 ascii,那么这有什么关系呢?
  3. 我的 Windows 版本重要吗?我正在使用Windows 10 x64

【问题讨论】:

  • 你不需要OEM_CHARSET。引用的问答说明了预期目的:获得等宽字体。
  • @IInspectable 谢谢!但是,如果我删除OEM_CHARSET,字体仍然是等宽的吗?我指定了FIXED_PITCH,所以应该是对的?
  • 只要你选择的是等距的字体(比如“Cascadia Mono”)。只是不要使用“系统”,它是a font that nobody uses any more

标签: c++ windows winapi fonts


【解决方案1】:

系统字体是比例字体,因此字体映射器很难找到名称为SystemFIXED_PITCH 字体。因为FIXED_PITCH 的优先级高于字体名称,所以字体映射器会尝试替换另一个至少部分满足规定要求的字体,并选择一些固定间距字体。

要解决此问题,请指定固定间距字体的名称,例如FixedSys *、Terminal *、Lucida ConsoleCourier *、Courier New 等或根本不指定名称。标有 * 的字体是光栅字体(位图)。根据您的用例,它可能是好是坏。

1
我不确定OEM_CHARSET 在这种情况下究竟是如何发挥作用的,但字体映射器会尝试选择覆盖给定字符集中字符的字体,因此它可能会限制合适的字体替换,并给你不同的结果。

2
我认为在默认代码页为CP1250 的波兰语言环境中,OEM_CHARSET 选择具有更多类似 DOS 的字符集的CP852(例如方框图字符)。

3
它可能取决于 Windows 版本,但受安装的字体扩展可能的字体替换的影响更大。

【讨论】:

  • 负责根据用户提供的要求匹配字体的系统称为“字体映射器”,而不是“字体管理器”
猜你喜欢
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 2015-12-21
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多