关于BCMenu在VC6和Vc9,VC2008一些用法差异

来源:互联网 发布:photo shop mac破解版 编辑:程序博客网 时间:2024/04/30 13:42

最近引用了一个自绘菜单BCMenu类,发现其在VC6运行没有什么差错,在vs2008环境下就会报错,

错误来源来自BCMenu.cpp 1781行

VERIFY (SystemParametersInfo (SPI_GETNONCLIENTMETRICS,nm.cbSize,&nm,0));

 

感觉可能是编译环境差异造成的,于是通过查找资料,果然有类似的解决方法,在百度博客中

一名为 乘客 的大侠给做了如下解释,非常详细,也算给遇到这方面问题的朋友有个借鉴!可惜我的英文不怎么好,但也明白了错误的大概,其原文如下:

 

SystemParametersInfo SPI_GETNONCLIENTMETRICS 总是返回失败的原因
2009年05月05日 星期二 上午 10:37

关键字 :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)

原创粉丝点击