最近引用了一个自绘菜单BCMenu类,发现其在VC6运行没有什么差错,在vs2008环境下就会报错,
错误来源来自BCMenu.cpp 1781行
VERIFY (SystemParametersInfo (SPI_GETNONCLIENTMETRICS,nm.cbSize,&nm,0));
感觉可能是编译环境差异造成的,于是通过查找资料,果然有类似的解决方法,在百度博客中
一名为 乘客 的大侠给做了如下解释,非常详细,也算给遇到这方面问题的朋友有个借鉴!可惜我的英文不怎么好,但也明白了错误的大概,其原文如下:
关键字 :SystemParametersInfo SPI_GETNONCLIENTMETRICS NONCLIENTMETRICS 偶然用到 SystemParametersInfo 的 SPI_GETNONCLIENTMETRICS 发现总是返回失败.仔细看了 SPI_GETNONCLIENTMETRICS 和 NONCLIENTMETRICS 没有发现有不对的地方, 一搜索发现原来是 WINVER 的定义有点高了,在本地安装的MSDN文档里根本没说任何东西,但是在MS的在线文档里却赫然有 ////////////////////////////////////////////////////////////////////////////////////////
iPaddedBorderWidth The thickness of the padded border, in pixels. The default value is 4 pixels. The iPaddedBorderWidth and iBorderWidth members are combined for both resizable and nonresizable windows in the Windows Aero desktop experience. To compile an application that uses this member, define _WIN32_WINNT as 0x0600 or later. For more information, see Remarks. Windows Server 2003 and Windows XP/2000: This member is not supported. http://msdn.microsoft.com/en-us/library/ms724506(VS.85).aspx //////////////////////////////////////////////////////////////////////////////////////// 而我的本地的MSDN只有 ///////////////////////// iPaddedBorderWidth TBD ms-help://MS.MSDNQTR.v90.chs/sysinfo/base/nonclientmetrics_str.htm ///////////////////// 根本就不知道TBD是个啥... 看看头文件的定义 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 */ } NONCLIENTMETRICSA, *PNONCLIENTMETRICSA, FAR* LPNONCLIENTMETRICSA; 解决方案 要么把WINVER小于0x600 要么直接 NONCLIENTMETRICS.cbSize = sizeof(NONCLIENTMETRICS) - sizeof(NONCLIENTMETRICS.iPaddedBorderWidth); 也可以. |
踏提供的解决方法中
NONCLIENTMETRICS.cbSize = sizeof(NONCLIENTMETRICS) - sizeof(NONCLIENTMETRICS.iPaddedBorderWidth);
感觉不好使,也许没改明白
那只好改 WINVER的值了
其定义在afxv_w32.h 头文件中 修改其值小于0x0600 保存编译运行问题解决
至于修改其值小于0x0600
英文翻译过来如下
iPaddedBorderWidth的填充边界的厚度像素。默认值是4个像素。该iPaddedBorderWidth和iBorderWidth成员组合为调整大小,在Windows Aero桌面体验nonresizable窗口。要编译的应用程序使用此成员,定义_WIN32_WINNT为0x0600或更高版本。欲了解更多信息,请参见备注。 Windows Server 2003和Windows XP/2000的:该成员不支持。 http://msdn.microsoft.com/en-us/library/ms724506(VS.85).aspx(我的系统为Xp)