There are currently 23 posts.
Font size: Small - 100% (Default)  Content converter: No conversion
 
Clicks Replies
2992 22
【对比】Windows7系统下五种获取系统默认字体代码的效果
巨大八爪鱼
武林盟主 二十一级
Reply
Floor 1 Posted at: 5/24/16 15:28
[1]
hfontCaption = (HFONT)GetStockObject(DEFAULT_GUI_FONT);

运行结果:
文本框、单选框、复选框完全无法显示。
按钮和下拉菜单框的字显示正常。
巨大八爪鱼
武林盟主 二十一级
Reply
Floor 2 Posted at: 5/24/16 15:30
[2]
hfontCaption = NULL;

运行结果:
文本框、单选框、复选框完全无法显示。
按钮和下拉菜单框的字的字体不正常。
巨大八爪鱼
武林盟主 二十一级
Reply
Floor 3 Posted at: 5/24/16 15:31
[3]
ncm.cbSize = sizeof(NONCLIENTMETRICS);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, (UINT)NULL);
hfontCaption = (HFONT)GetStockObject(DEFAULT_GUI_FONT);

[4]
ncm.cbSize = sizeof(NONCLIENTMETRICS) - sizeof(int);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, (UINT)NULL);
hfontCaption = (HFONT)GetStockObject(DEFAULT_GUI_FONT);


运行结果:
所有控件字体正常。(仅仅是加了获取ncm的代码,而变量ncm后面根本没有用到)
巨大八爪鱼
武林盟主 二十一级
Reply
Floor 4 Posted at: 5/24/16 15:32
[5]
ncm.cbSize = sizeof(NONCLIENTMETRICS) - sizeof(int);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, (UINT)NULL);
hfontCaption = CreateFontIndirect(&ncm.lfCaptionFont);


运行结果:
所有控件字体正常。但和3、4字体不同。
巨大八爪鱼
武林盟主 二十一级
Reply
Floor 5 Posted at: 5/24/16 15:34
至于XP系统,上述五段代码编译后运行,效果都是一样的:

所有的控件都无法显示!
就连楷体都无法识别!
巨大八爪鱼
武林盟主 二十一级
Reply
Floor 6 Posted at: 5/24/16 15:35
楷体字的代码:
void InitFont(void)
{
    LOGFONT logfont;
    ZeroMemory(&logfont, sizeof(logfont));
    logfont.lfCharSet = GB2312_CHARSET; // 字符集
    lstrcpy(logfont.lfFaceName, TEXT("楷体")); // 字体名称
    logfont.lfHeight = 48; // 字体大小
    logfont.lfQuality = ANTIALIASED_QUALITY; // 字体品质
    logfont.lfWeight = FW_BOLD; // 是否为粗体
    //logfont.lfItalic = TRUE; // 是否为斜体
    hfontCustom = CreateFontIndirect(&logfont);
}
巨大八爪鱼
武林盟主 二十一级
Reply
Floor 7 Posted at: 5/24/16 15:37
本人似乎明白了一点!
因为自己忘了在主函数里加InitCommonControls();了!
所以XP系统下无法初始化XP风格的控件!
巨大八爪鱼
武林盟主 二十一级
Reply
Floor 8 Posted at: 5/24/16 15:38
于是赶快加上这句话:

巨大八爪鱼
武林盟主 二十一级
Reply
Floor 9 Posted at: 5/24/16 15:42
[1]
hfontCaption = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
巨大八爪鱼
武林盟主 二十一级
Reply
Floor 10 Posted at: 5/24/16 15:43
[2]
hfontCaption = NULL;
巨大八爪鱼
武林盟主 二十一级
Reply
Floor 11 Posted at: 5/24/16 15:44
[3]
ncm.cbSize = sizeof(NONCLIENTMETRICS);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, (UINT)NULL);
hfontCaption = (HFONT)GetStockObject(DEFAULT_GUI_FONT);

【说明】
ncm.cbSize = sizeof(NONCLIENTMETRICS); 这句话不兼容XP系统
必须减掉一个sizeof(int),SystemParametersInfo才能正常工作
巨大八爪鱼
武林盟主 二十一级
Reply
Floor 12 Posted at: 5/24/16 15:44
[4]
ncm.cbSize = sizeof(NONCLIENTMETRICS) - sizeof(int);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, (UINT)NULL);
hfontCaption = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
巨大八爪鱼
武林盟主 二十一级
Reply
Floor 13 Posted at: 5/24/16 15:45
[5]
ncm.cbSize = sizeof(NONCLIENTMETRICS) - sizeof(int);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, (UINT)NULL);
hfontCaption = CreateFontIndirect(&ncm.lfCaptionFont);
巨大八爪鱼
武林盟主 二十一级
Reply
Floor 14 Posted at: 5/24/16 15:47
[6]
ncm.cbSize = sizeof(NONCLIENTMETRICS) - sizeof(int);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, (UINT)NULL);
ncm.lfCaptionFont.lfWeight = FW_NORMAL; // 取消粗体属性
hfontCaption = CreateFontIndirect(&ncm.lfCaptionFont);
巨大八爪鱼
武林盟主 二十一级
Reply
Floor 15 Posted at: 5/24/16 15:57
巨大八爪鱼
武林盟主 二十一级
Reply
Floor 16 Posted at: 5/24/16 15:59
我觉得代码4的字体在两个系统下都很好。
代码6的字体在Win7下很常见(例如记事本的字体对话框就是用的这个字体),但XP中很不常见。
巨大八爪鱼
武林盟主 二十一级
Reply
Floor 17 Posted at: 5/24/16 16:03
XP系统下只读文本框的黑色背景块可以在消息处理函数的switch语句中添加如下代码解决:
case WM_CTLCOLORSTATIC: // 消除Static控件、滑块控件和只读文本框的背景颜色
        return (LRESULT)GetStockObject(WHITE_BRUSH);

效果:
巨大八爪鱼
武林盟主 二十一级
Reply
Floor 18 Posted at: 5/24/16 16:04
这幅截图的字体是用的代码4
巨大八爪鱼
武林盟主 二十一级
Reply
Floor 19 Posted at: 5/24/16 16:05
我记得,Win7中文版下设置IP地址的对话框上的字体就是用的代码4的字体
巨大八爪鱼
武林盟主 二十一级
Reply
Floor 20 Posted at: 5/24/16 16:23
Windows XP中文版下只有“楷体_GB2312”字体,没有“楷体”字体。
而Windows 7下只有“楷体”字体,没有“楷体_GB2312”字体。(我用的是英文版的系统,中文版不知道是不是这样)
所以上面的截图中XP系统下楷体字没有正常显示。
但是把字体名称改成“楷体_GB2312”后,XP下正常了,但Win7下却反而不正常了

巨大八爪鱼
武林盟主 二十一级
Reply
Floor 21 Posted at: 5/24/16 16:25
巨大八爪鱼
武林盟主 二十一级
Reply
Floor 22 Posted at: 5/24/16 17:13
【XP下楷体字不能显示的解决方案】
int CALLBACK FontExistsProc(const LOGFONT *lpelfe, const TEXTMETRIC *lpntme, DWORD FontType, LPARAM lParam)
{
    return 0; // 直接终止EnumFontFamiliesEx函数的运行
}

// 判断字体是否存在的函数
BOOL FontExists(LPLOGFONT lpFont)
{
    HDC hdc = GetDC(NULL);
    BOOL bResult = (EnumFontFamiliesEx(hdc, lpFont, FontExistsProc, (LPARAM)NULL, (DWORD)NULL) == 0);
    ReleaseDC(NULL, hdc);
    return bResult;
}

// 创建自定义字体对象
void InitFont(void)
{
    LOGFONT logfont;
    ZeroMemory(&logfont, sizeof(logfont));
    logfont.lfCharSet = GB2312_CHARSET; // 字符集
    lstrcpy(logfont.lfFaceName, TEXT("楷体")); // 字体名称
    logfont.lfHeight = 48; // 字体大小
    logfont.lfQuality = ANTIALIASED_QUALITY; // 字体品质
    logfont.lfWeight = FW_BOLD; // 是否为粗体
    //logfont.lfItalic = TRUE; // 是否为斜体

    // 如果字体不存在, 就更换名称
    if (!FontExists(&logfont))
        lstrcpy(logfont.lfFaceName, TEXT("楷体_GB2312"));
   
    hfontCustom = CreateFontIndirect(&logfont);
}
巨大八爪鱼
武林盟主 二十一级
Reply
Floor 24 Posted at: 5/24/16 20:27
代码[1]和代码[4]在两个系统下有着相似的效果。虽然hFontCaption都是赋的一样的值,仅仅是多获取了一下NCM,就会产生截然不同的效 果。据此可推测一定是SystemParametersInfo在获取NCM的同时也影响了GetStockObject。
Reply the post
Content:
User: You are currently anonymous.
Captcha:
Unclear? Try another one.
(Shortcut key: Ctrl+Enter)
Post Information
Clicks: 2992 Replies: 22
Author: 巨大八爪鱼
Last reply: 巨大八爪鱼
Last reply time: 5/24/16 20:27
Bar Good Posts
Announcements