如何让Win32使用Windows XP样式的字体

3

我正在使用纯C和WinAPI编写Win32应用程序,不允许使用MFC或C ++。为了让控件使用适当的样式绘制,我使用一个清单,如相应的MSDN文章所述。一切都很好,当我更改系统样式时,我的应用程序也会更改样式。但是使用的字体很丑。如何强制应用程序使用标准系统字体?

1个回答

5
您可以使用带有SPI_GETNONCLIENTMETRICS参数的SystemParametersInfo来检索当前字体。SystemParametersInfo将考虑当前主题,并提供标题、菜单和消息对话框的字体信息。该函数将检索NONCLIENTMETRICS结构(请参见http://msdn.microsoft.com/en-us/library/ff729175(v=VS.85).aspx)),其中包含您需要的所有信息。请注意GetStockObject的备注http://msdn.microsoft.com/en-us/library/dd144925(VS.85).aspx
typedef struct tagNONCLIENTMETRICS {
  UINT    cbSize;
  int     iBorderWidth;
  int     iScrollWidth;
  int     iScrollHeight;
  int     iCaptionWidth;
  int     iCaptionHeight;
  LOGFONT lfCaptionFont;
  int     iSmCaptionWidth;
  int     iSmCaptionHeight;
  LOGFONT lfSmCaptionFont;
  int     iMenuWidth;
  int     iMenuHeight;
  LOGFONT lfMenuFont;
  LOGFONT lfStatusFont;
  LOGFONT lfMessageFont;
#if (WINVER >= 0x0600)
  int     iPaddedBorderWidth;
#endif 
} NONCLIENTMETRICS, *PNONCLIENTMETRICS, *LPNONCLIENTMETRICS;

一个示例,如何在窗口/控件中创建和设置字体,如果您知道LOGFONT参数,请参见更改Win32 Windows项目中的默认窗口字体示例末尾,但使用不是来自GetStockObject(DEFAULT_GUI_FONT)LOGFONT,而是由SystemParametersInfo返回的带有SPI_GETNONCLIENTMETRICS参数的LOGFONT

关于您提供的链接,还有一个问题:是否可以将主窗口创建为资源(类似于WinAPI表单)?如果是,则可能不需要从代码中进行操作。 - iksemyonov
您可以将对话框用作主窗口并将其保存在资源中。然后,您只需要为对话框选择字体即可。如果您的程序可以组织为基于对话框的,则字体将不会成为问题。 - Oleg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接