【问题标题】:Query Windows' Color and Appearance查询窗口的颜色和外观
【发布时间】:2016-05-19 05:23:36
【问题描述】:

我正在用 OpenGL 编写一个小型 GUI 库,以获取乐趣和利润。在字体处理方面,到目前为止,我需要客户端应用程序显式加载所有字体并将它们设置在小部件上。到目前为止还可以,我还有一种方法可以将它们设置为某种类型的所有小部件的默认值。

虽然这是可行的,但我认为使用系统的默认字体作为默认字体不是很花哨吗?对于 Windows,这将是通过 Color and Appearance 对话框配置的字体。

在热身我生锈的 Win32 编程知识并弄脏 MSDN 之后,我找不到这个问题的答案。我可以按名称加载字体并将其设置在任何小部件上,但弄清楚 Win32 将使用什么字体作为默认字体让我难以理解。

到目前为止,我发现的最好的是带有SPI_GETNONCLIENTMETRICSSystemParametersInfo 函数。但这些只是“非客户端”区域的设置,如窗口标题栏等。

【问题讨论】:

  • 我可能只是偶然发现了我的解决方案;使用GetStockObject(DEFAULT_GUI_FONT) 并通过这种方法进行有根据的猜测:codeproject.com/Articles/1235/…
  • SPI_GETNONCLIENTMETRICS 是你想用的,forget about DEFAULT_GUI_FONT
  • 执行此操作的方式与 Microsoft GUI 构建器相同。在 9 点处选择 Segoe UI 作为默认值,让字体映射器在旧操作系统上自动找到替代品。只需确保子窗口使用其父窗口的字体作为默认字体,这样用户只需更改主窗口字体并且一切看起来一致。
  • Hans 建议的唯一问题是字体映射器会给你一个 9 点字体,这与系统上其他地方使用的字体大小不一致。对字体大小进行硬编码会让您遇到有意选择不同大小字体而不是更改其 DPI 设置的用户的问题。与 Windows 捆绑在一起的微软应用程序只需支持单个版本的 Windows,Office 团队费了很大的力气,基本上重新发明了窗口管理器。所以我不确定其他应用程序是做什么的。
  • @CodyGray 没错,但请记住这是一个 OpenGL GUI,设计用于全屏使用,它只是默认回退行为的一个想法。此外,我正在重新发明轮子,因为我正在构建一个完整的用户界面库......

标签: c winapi fonts


【解决方案1】:

DEFAULT_GUI_FONT 不是您的解决方案。这个名字听起来确实不错,而且确实历史上某个时候的默认 GUI 字体,但该字体已经多年没有使用了。

您已经偶然发现了正确的解决方案:使用 SPI_GETNONCLIENTMETRICS 选项调用 SystemParametersInfo。这将使用有关标准系统字体的信息填充NONCLIENTMETRICS 结构。

该结构中的“标准 UI 字体”称为lfMessageFont。它用于消息框、对话框和窗口客户区其他地方的文本。它与“外观”属性中可配置的相同。

我写了a very detailed answer about fonts in Windows applications a few years ago。一种侧重于 MFC,因此我选择不将此问题标记为与其他问题重复并编写单独的答案,但实际上您需要的所有信息都在那里。

为了好玩,我会告诉您,您可以通过调用GetSysColor function 来获取系统颜色。传递COLOR_* 值之一以指示您想要的颜色;您将返回一个COLORREF 值(类型定义为一个 32 位无符号整数,其中包含颜色的红色、绿色和蓝色分量值)。使用GetRValueGetGValueGetBValue 宏来提取各个组件;我怀疑 OpenGL 想要 COLORREF 值。

【讨论】:

  • 谢谢,有时您会忽略显而易见的事情。再说一遍,“非客户区”有点误导。
猜你喜欢
  • 2013-08-05
  • 1970-01-01
  • 2012-09-05
  • 2019-04-18
  • 1970-01-01
  • 2012-08-18
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多