几天前我订购了Windows第五版编程,并开始使用它。我开始学习win32 API,但是,我有一个问题。窗口看起来一点也不现代winxp/win vista/win 7的风格。我该怎么解决这个问题?它目前看起来像这样,垃圾字体和所有。
先谢了!马希尔
lawou6xi1#
要获得正确的字体,应该在CreateWindow(Ex)之后调用:
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));
46qrfjad2#
很显然,你并没有真正读过这本书,你在寻找WM_SETFONT,这是有原因的,通用控件不是这本书首先涉及的内容。
eh57zj3b3#
您可能希望选中GetThemeSysFont以填充适当系统字体的LOGFONT,使用CreateFontIndirect创建它,并使用WM_SETFONT将它分配给您创建的每个控件。据我所知,没有办法为应用程序中新创建的窗口设置不同的默认值。也没有办法在一个步骤中设置所有已经创建的窗口(即,不是循环遍历所有窗口,或者单独分配)。例外是对话框,当从资源创建时,允许资源指定对话框上所有控件使用的字体。
GetThemeSysFont
LOGFONT
CreateFontIndirect
WM_SETFONT
cgyqldqp4#
您需要使用WM_SETFONT为每个控件设置字体,通过将NONCLIENTMETRICS.lfMessageFont传递给CreateFontIndirect(使用SystemParametersInfo(SPI_GETNONCLIENTMETRICS,...)获取NONCLIENTMETRICS)来创建字体对于dialog boxes,在〈Vista上使用伪字体“MS Shell Dlg“@8pt,在〉= Vista上使用伪字体“Segoe UI”@9pt
4zcjmb1e5#
你可能想发布一些屏幕截图,确切地说,你在谈论什么差异,这将有助于弄清楚你需要改变什么。一般来说,我会说,你可能需要包括一个适当的清单与您的应用程序,使您的应用程序使用最新的公共控件。此外,现在大多数UI不是使用SDK风格的代码开发的,这很难编程/维护,而是使用某种UI库,至少是MFC。
5条答案
按热度按时间lawou6xi1#
要获得正确的字体,应该在
CreateWindow(Ex)
之后调用:46qrfjad2#
很显然,你并没有真正读过这本书,你在寻找WM_SETFONT,这是有原因的,通用控件不是这本书首先涉及的内容。
eh57zj3b3#
您可能希望选中
GetThemeSysFont
以填充适当系统字体的LOGFONT
,使用CreateFontIndirect
创建它,并使用WM_SETFONT
将它分配给您创建的每个控件。据我所知,没有办法为应用程序中新创建的窗口设置不同的默认值。也没有办法在一个步骤中设置所有已经创建的窗口(即,不是循环遍历所有窗口,或者单独分配)。例外是对话框,当从资源创建时,允许资源指定对话框上所有控件使用的字体。
cgyqldqp4#
您需要使用WM_SETFONT为每个控件设置字体,通过将NONCLIENTMETRICS.lfMessageFont传递给CreateFontIndirect(使用SystemParametersInfo(SPI_GETNONCLIENTMETRICS,...)获取NONCLIENTMETRICS)来创建字体
对于dialog boxes,在〈Vista上使用伪字体“MS Shell Dlg“@8pt,在〉= Vista上使用伪字体“Segoe UI”@9pt
4zcjmb1e5#
你可能想发布一些屏幕截图,确切地说,你在谈论什么差异,这将有助于弄清楚你需要改变什么。
一般来说,我会说,你可能需要包括一个适当的清单与您的应用程序,使您的应用程序使用最新的公共控件。
此外,现在大多数UI不是使用SDK风格的代码开发的,这很难编程/维护,而是使用某种UI库,至少是MFC。