【发布时间】:2016-05-19 05:23:36
【问题描述】:
我正在用 OpenGL 编写一个小型 GUI 库,以获取乐趣和利润。在字体处理方面,到目前为止,我需要客户端应用程序显式加载所有字体并将它们设置在小部件上。到目前为止还可以,我还有一种方法可以将它们设置为某种类型的所有小部件的默认值。
虽然这是可行的,但我认为使用系统的默认字体作为默认字体不是很花哨吗?对于 Windows,这将是通过 Color and Appearance 对话框配置的字体。
在热身我生锈的 Win32 编程知识并弄脏 MSDN 之后,我找不到这个问题的答案。我可以按名称加载字体并将其设置在任何小部件上,但弄清楚 Win32 将使用什么字体作为默认字体让我难以理解。
到目前为止,我发现的最好的是带有SPI_GETNONCLIENTMETRICS 的SystemParametersInfo 函数。但这些只是“非客户端”区域的设置,如窗口标题栏等。
【问题讨论】:
-
我可能只是偶然发现了我的解决方案;使用
GetStockObject(DEFAULT_GUI_FONT)并通过这种方法进行有根据的猜测:codeproject.com/Articles/1235/… -
SPI_GETNONCLIENTMETRICS是你想用的,forget aboutDEFAULT_GUI_FONT -
执行此操作的方式与 Microsoft GUI 构建器相同。在 9 点处选择 Segoe UI 作为默认值,让字体映射器在旧操作系统上自动找到替代品。只需确保子窗口使用其父窗口的字体作为默认字体,这样用户只需更改主窗口字体并且一切看起来一致。
-
Hans 建议的唯一问题是字体映射器会给你一个 9 点字体,这与系统上其他地方使用的字体大小不一致。对字体大小进行硬编码会让您遇到有意选择不同大小字体而不是更改其 DPI 设置的用户的问题。与 Windows 捆绑在一起的微软应用程序只需支持单个版本的 Windows,Office 团队费了很大的力气,基本上重新发明了窗口管理器。所以我不确定其他应用程序是做什么的。
-
@CodyGray 没错,但请记住这是一个 OpenGL GUI,设计用于全屏使用,它只是默认回退行为的一个想法。此外,我正在重新发明轮子,因为我正在构建一个完整的用户界面库......