|  | 【对比】Windows7系统下五种获取系统默认字体代码的效果 | 
                
          |   一派護法 十九級 | 
              [1] hfontCaption = (HFONT)GetStockObject(DEFAULT_GUI_FONT);  运行结果: 文本框、单选框、复选框完全无法显示。 按钮和下拉菜单框的字显示正常。             | 
                
          |   一派護法 十九級 | 
              [2] hfontCaption = NULL;  运行结果: 文本框、单选框、复选框完全无法显示。 按钮和下拉菜单框的字的字体不正常。             | 
                
          |   一派護法 十九級 | 
              [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后面根本没有用到)             | 
                
          |   一派護法 十九級 | 
              [5] ncm.cbSize = sizeof(NONCLIENTMETRICS) - sizeof(int); SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, (UINT)NULL); hfontCaption = CreateFontIndirect(&ncm.lfCaptionFont);  运行结果: 所有控件字体正常。但和3、4字体不同。             | 
                
          |   一派護法 十九級 | 
              至于XP系统,上述五段代码编译后运行,效果都是一样的:  所有的控件都无法显示! 就连楷体都无法识别!             | 
                
          |   一派護法 十九級 | 
              楷体字的代码: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);
 }
 
 | 
                
          |   一派護法 十九級 | 
              本人似乎明白了一点!因为自己忘了在主函数里加InitCommonControls();了!
 所以XP系统下无法初始化XP风格的控件!
 
 | 
                
          |   一派護法 十九級 | 
              于是赶快加上这句话:   | 
                
          |   一派護法 十九級 | 
              [1] hfontCaption = (HFONT)GetStockObject(DEFAULT_GUI_FONT);   | 
                
          |   一派護法 十九級 | 
              [2] hfontCaption = NULL;   | 
                
          |   一派護法 十九級 | 
              [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才能正常工作             | 
                
          |   一派護法 十九級 | 
              [4] ncm.cbSize = sizeof(NONCLIENTMETRICS) - sizeof(int); SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, (UINT)NULL); hfontCaption = (HFONT)GetStockObject(DEFAULT_GUI_FONT);   | 
                
          |   一派護法 十九級 | 
              [5] ncm.cbSize = sizeof(NONCLIENTMETRICS) - sizeof(int); SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, (UINT)NULL); hfontCaption = CreateFontIndirect(&ncm.lfCaptionFont);   | 
                
          |   一派護法 十九級 | 
              [6] ncm.cbSize = sizeof(NONCLIENTMETRICS) - sizeof(int); SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, (UINT)NULL); ncm.lfCaptionFont.lfWeight = FW_NORMAL; // 取消粗体属性 hfontCaption = CreateFontIndirect(&ncm.lfCaptionFont);   | 
                
          |   一派護法 十九級 |  | 
                
          |   一派護法 十九級 | 
              我觉得代码4的字体在两个系统下都很好。代码6的字体在Win7下很常见(例如记事本的字体对话框就是用的这个字体),但XP中很不常见。
 
 | 
                
          |   一派護法 十九級 | 
              XP系统下只读文本框的黑色背景块可以在消息处理函数的switch语句中添加如下代码解决: case WM_CTLCOLORSTATIC: // 消除Static控件、滑块控件和只读文本框的背景颜色         return (LRESULT)GetStockObject(WHITE_BRUSH); 效果:   | 
                
          |   一派護法 十九級 | 
              这幅截图的字体是用的代码4
 | 
                
          |   一派護法 十九級 | 
              我记得,Win7中文版下设置IP地址的对话框上的字体就是用的代码4的字体             | 
                
          |   一派護法 十九級 | 
              Windows XP中文版下只有“楷体_GB2312”字体,没有“楷体”字体。 而Windows 7下只有“楷体”字体,没有“楷体_GB2312”字体。(我用的是英文版的系统,中文版不知道是不是这样) 所以上面的截图中XP系统下楷体字没有正常显示。 但是把字体名称改成“楷体_GB2312”后,XP下正常了,但Win7下却反而不正常了    | 
                
          |   一派護法 十九級 |  | 
                
          |   一派護法 十九級 | 
              【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);
 }
 
 | 
                
          |   一派護法 十九級 | 
              代码[1]和代码[4]在两个系统下有着相似的效果。虽然hFontCaption都是赋的一样的值,仅仅是多获取了一下NCM,就会产生截然不同的效
果。据此可推测一定是SystemParametersInfo在获取NCM的同时也影响了GetStockObject。             |