winapi - CreateFont的charset参数到底设置了什么?

标签 winapi internationalization fonts character-encoding gdi

我的 Windows 上的代码页设置为 ANSI(Latin1、Windows-1252)。
我使用 CreateFont 创建字体并在 fdwCharSet 中传递 RUSSIAN_CHARSET

这是我的经历:

  • 使用此字体的 Windows 控件(例如 Static)会忽略该字体的字符集:传递给 SetWindowTextA 的字符串以拉丁字符显示
  • 在 DC 上选择此字体后,GDI 文本函数 (Ext)TextOutA 和 DrawTextA 将使用该字体的字符集。传递给它们的字符串以西里尔字母显示。
为什么?何时考虑字体的字符集参数,何时忽略它?我可以强制 Windows 控件使用字体的字符集吗?

最佳答案

您必须将文本转换为 Unicode 并调用 SetWindowTextW() 而不是 SetWindowTextA()

确保窗口的类是通过 RegisterClassW() 注册的,而不是通过 RegisterClassA() 注册的。这才是真正决定窗口是否为 Unicode 的因素。您可以使用 IsWindowUnicode() 来验证窗口是否确实是 Unicode。

确保将未处理的消息传递给 DefWindowProcW() 而不是 DefWindowProcA()

或者,如果窗口是一个对话框,只需确保它是使用 CreateDialogW()DialogBoxParamW() 创建的。

关于winapi - CreateFont的charset参数到底设置了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6387545/

相关文章:

ruby-on-rails - Redis 对于 Rails 生产 I18n 来说太慢了吗?

css - 如何将 font-weight 与 font-face 字体一起使用?

html - 如何获得漂亮的字体平滑? (以及如何模仿 Medium.com 字体样式?)

Java AWT : Is Font a lightweight object?

c++ - Winapi C++ : DialogBox hangs when breaking a loop

适用于 XP 的 Windows 防火墙规则

java - CreateProcessW 失败 (ACCESS_DENIED)

c++ - 带有 OFN_ALLOWMULTISELECT 的 CFileDialog 快捷方式的错误结果

java - 对于默认不支持的语言环境,如何将本地化添加到 JFileChooser?

javascript - HTML编码°度数符号额外空格