【发布时间】: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_CHARSET、FIXED_PITCH 和System 是必需的。
我的问题是:
- 为什么
OEM_CHARSET用完全不同的字体呈现System字体? -
OEM_CHARSET还能做什么?文档只是说明它以不同的方式映射字符,但我使用的是普通的ascii,那么这有什么关系呢? - 我的 Windows 版本重要吗?我正在使用
Windows 10 x64。
【问题讨论】:
-
你不需要
OEM_CHARSET。引用的问答说明了预期目的:获得等宽字体。 -
@IInspectable 谢谢!但是,如果我删除
OEM_CHARSET,字体仍然是等宽的吗?我指定了FIXED_PITCH,所以应该是对的? -
只要你选择的是等距的字体(比如“Cascadia Mono”)。只是不要使用“系统”,它是a font that nobody uses any more。