【问题标题】:How can I make the Win32 API window more modern looking?如何使 Win32 API 窗口看起来更现代?
【发布时间】:2011-03-20 09:47:47
【问题描述】:

几天前我订购了 Programming Windows Fifth Edition,并开始使用它。

我开始学习win32 api,但是,我有一个问题。 Windows 看起来根本不像现代的 winxp/win vista/win 7 风格。我该如何解决这个问题?

目前看起来像这样,废话字体等等。

提前致谢!

马歇尔

【问题讨论】:

  • @Camilo Martin:Visual Studio 中的视觉设计器仅适用于托管项目。它们不适用于 C 和 C++。
  • Win32 API 在 2010 年?受虐狂的有趣转折。
  • +1 用经典的大部头做硬码,这是非常值得的。你知道那本书的作者现在在他的博客上发布了很多与 WPF 和 Silverlight 相关的东西吗?
  • @Paul + @Slugster:有些人不能要求我们的用户下载和安装大量运行时库。我喜欢托管语言,但您需要先安装运行时这一事实对许多人来说是个大问题。
  • 我喜欢 Win32 API。为什么要放弃一个完美运行的系统,仅仅因为它最初并不是为想要在社交媒体上讨论当今服装的青少年设计的?

标签: c++ c windows winapi interface


【解决方案1】:

要获得正确的字体,您应该在 CreateWindow(Ex) 之后调用它:

NONCLIENTMETRICS ncm;
ncm.cbSize = sizeof(NONCLIENTMETRICS);
::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0);
HFONT hFont = ::CreateFontIndirect(&ncm.lfMessageFont);
::SendMessage(hwnd, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0));

【讨论】:

  • 对不起,这不正确,不应标记为答案,见blogs.msdn.com/b/oldnewthing/archive/2005/07/07/436435.aspx
  • 你查看我的链接了吗?它甚至告诉您正确的 API 是什么“它是在 Windows 95 开发期间创建的,希望成为新的默认 GUI 字体,但到 1994 年 7 月,Windows 本身停止使用它,转而支持 SystemParametersInfo 函数返回的各种字体”
  • 是的,我在几年前也读过,但我无法重现声称的问题。
【解决方案2】:

显然,你并没有真正读过这本书。您正在寻找WM_SETFONT。通用控件不是本书首先介绍的内容是有原因的。

【讨论】:

  • 我喜欢随机投反对票,而无需过多评论为什么。不是!
  • 我认为投反对票是因为他关注的不仅仅是字体,而是整体上更现代的风格。 (我自己不知道这件事,我猜有一个不同的小部件集,可能还有一组完全不同的 API,以某种方式涉及。)请注意,我没有投反对票。
  • @fennec:他发布的按钮图片使用的是现代风格(字体除外)。经典按钮有灰色边框,而不是蓝色。
  • 我没有搜索足够长的时间,我想,在我的热情中,但是,我知道 WM_SETFONT,问题在于如何充分利用它。老实说,我真的无法在书中找到将所有窗口字体更改为另一种字体的代码。
  • 原谅你不记得页码:)
【解决方案3】:

您需要使用WM_SETFONT 为每个控件设置字体,您可以通过将NONCLIENTMETRICS.lfMessageFont 传递给CreateFontIndirect 来创建字体(使用SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ...) 来获取NONCLIENTMETRICS)

对于dialog boxes,您使用伪字体“MS Shell Dlg”@8pt on = Vista

【讨论】:

    【解决方案4】:

    您可能需要检查GetThemeSysFont 以填充适当系统字体的LOGFONT,使用CreateFontIndirect 创建它,并使用WM_SETFONT 将其分配给您创建的每个控件。

    据我所知,无法为应用程序中新创建的窗口设置不同的默认值。也没有办法在一个步骤中设置您已经创建的所有窗口(即,而不是只是循环通过它们,或单独分配)。例外是对话框,当从资源创建时允许资源指定用于对话框上所有控件的字体。

    【讨论】:

    【解决方案5】:

    您可能想发布一些关于您所谈论的差异的屏幕截图,这将有助于找出您需要更改的内容。

    一般来说,您可能需要在您的应用中包含一个适当的清单,以便您的应用使用最新的通用控件。

    另外,现在大多数 UI 都不是使用 SDK 样式代码开发的,这很难编程/维护,而是使用某种 UI 库,至少是 MFC。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      相关资源
      最近更新 更多