Windows XP下static控件文字显示为倾斜或是乱码的原因分析

本文解决了一个自定义控件在Win7下的VS2008开发环境中正常,但在WinXP环境下出现文字倾斜或乱码的问题。通过调整SystemParametersInfo函数的参数以适应不同版本的Windows。

维护公司一个代码,开发环境在win7下的VS2008,Win7下面好好的,到了winxp下面static控件文字显示为倾斜文字或是乱码。按理来说,windows是会做一些向下兼容的,却出现这么离奇的问题。


一开始怀疑是style问题,用了ModifyStyle函数无效;

继而怀疑控件的各个属性为TRUE的选项,更改后依然无效;

没办法,只能注释掉无关代码,排查出出错范围,最后定位到Invalidate函数,进而怀疑自绘控件类的OnPaint函数问题。


知道问题所在后,一句一句分析观察,最后觉得VERIFY(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0));里的这个函数SystemParametersInfo不熟悉,尝试搜搜,百度了下发现还真是这个问题造成的。


附参考资料:SystemParametersInfo 关于VERIFY 出错

http://blog.youkuaiyun.com/dragoo1/article/details/8179636

xp sp3,vs2008

一个自定义继承与cdialog类,执行下面的代码报错

VERIFY(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0));

原先在vs2003是好的,百度,

这是由于以前的工程迁移到Visual stutio 2008上,而本人所使用的是XP出现的问题。 这是由于Visual studio 2008里面默认的Windows 版本是vista,而自己现在使用的是XP而出现的。

因为在新的 Windows SDK 6.0 中,其定义如下:

typedef struct tagNONCLIENTMETRICSA
{
    UINT    cbSize;
    int     iBorderWidth;
    int     iScrollWidth;
    int     iScrollHeight;
    int     iCaptionWidth;
    int     iCaptionHeight;
    LOGFONTA lfCaptionFont;
    int     iSmCaptionWidth;
    int     iSmCaptionHeight;
    LOGFONTA lfSmCaptionFont;
    int     iMenuWidth;
    int     iMenuHeight;
    LOGFONTA lfMenuFont;
    LOGFONTA lfStatusFont;
    LOGFONTA lfMessageFont;
#if(WINVER >= 0x0600)
    int     iPaddedBorderWidth;
#endif /* WINVER >= 0x0600 */
}

解决办法:

(一)如果你想用nm.cbSize = sizeof (NONCLIENTMETRICS) ; 这个是低版本,通常所说的0x0501,就在stdafx.h中

#pragma once

#ifndef _SECURE_ATL
#define _SECURE_ATL 1
#endif

#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN            // 从 Windows 头中排除极少使用的资料
#endif

这个语句的后面加上以下2句

#ifndef WINVER    // 允许使用特定于 Windows XP 或更高版本的功能。
#define WINVER 0x0501  // 将此值更改为相应的值,以适用于 Windows 的其他版本。
#endif

#ifndef _WIN32_WINNT  // 允许使用特定于 Windows XP 或更高版本的功能。
#define _WIN32_WINNT 0x0501 // 将此值更改为相应的值,以适用于 Windows 的其他版本。
#endif  

(二)同时支持 vista 或 XP ,Windows 2000, Windows Server 2003,那么应该先调用 GetVersionEx 检测Windows版本,然后决定是否需要减去 sizeof (ncms.iPaddedBorderWidth)


[cpp]  view plain  copy
  1. OSVERSIONINFOEX osvi;  
  2. memset(&osvi, 0, sizeof(OSVERSIONINFOEX));  
  3. osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);  
  4. if( !(GetVersionEx ((OSVERSIONINFO *) &osvi)) )  
  5. {  
  6.     osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);  
  7.     if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) )   
  8.         return;  
  9. }  
  10.   
  11. NONCLIENTMETRICS ncm;  
  12. if(osvi.dwMajorVersion <= 5 /*&& && osvi.dwMinorVersion == 1*/)//5000:2000,5001:xp,5002:win2003  
  13.     ncm.cbSize = sizeof(NONCLIENTMETRICS)- sizeof(ncm.iPaddedBorderWidth);  
  14. else  
  15.     ncm.cbSize = sizeof(NONCLIENTMETRICS);  
  16.   
  17. VERIFY(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0));  

参考:http://hi.baidu.com/vc_net/item/b8c5f761f70b9290c4d2494b
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值