操作系统:Windows 7 32位 开发工具:Visual Studio 2008
问题: 在Windows 7上运行时没关系,但是在XP下,DEBUG模式下出现断言错误,RELEASE模式下出现不可见的网格控制错误。 (就像你可以看到它如下图所示)
情况:
我用于该程序的网格控件类是从code-project下载的。 (我想我无法在stackoverflow中上传文件?如果你需要它,请告诉我。)
我曾经在VS 6.0中使用过这个类。这是我第一次在VS 9.0中使用它。在VS 6.0中使用它时没有错误。
在Windows 7和XP中编译程序时没有编译错误。
在Windows 7上,它在DEBUG和RELEASE模式下运行良好。
在Windows XP上,在DEBUG文件夹中运行exe文件会产生断言错误。当我在RELEASE文件夹中运行exe文件时,网格控件不会显示。
我还尝试使用Visual Studio在XP上编译以查看是否存在任何错误,但它只会产生运行时错误。
错误:
调试断言失败!计划:...... 文件:... / gridctrl_src / gridcell.cpp 行:228
有关您的计划的信息 可能会导致断言失败,请参阅 Visual C +文档 断言。
以下是错误行中的gridcell.cpp源代码。
/////////////////////////////////////////////////////////////////////////////
// CGridDefaultCell
CGridDefaultCell::CGridDefaultCell()
{
#ifdef _WIN32_WCE
m_nFormat = DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_NOPREFIX;
#else
m_nFormat = DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_NOPREFIX | DT_END_ELLIPSIS;
#endif
m_crFgClr = CLR_DEFAULT;
m_crBkClr = CLR_DEFAULT;
m_Size = CSize(30,10);
m_dwStyle = 0;
#ifdef _WIN32_WCE
LOGFONT lf;
GetObject(GetStockObject(SYSTEM_FONT), sizeof(LOGFONT), &lf);
SetFont(&lf);
#else // not CE
NONCLIENTMETRICS ncm;
ncm.cbSize = sizeof(NONCLIENTMETRICS);
VERIFY(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0));
SetFont(&(ncm.lfMessageFont));
#endif
}
提前谢谢!!
答案 0 :(得分:1)
在将项目从VC6移植到VS2012时,我遇到了与 CGridCtrl 相同的问题。
在项目中将_WIN32_WINNT
设置为您希望应用程序支持的最低目标平台。这是XP SP1的0x0501
。
CGridDefaultCell 中不需要更改代码。
答案 1 :(得分:0)
回答我自己的问题......
SystemParametersInfo(SPI_GETNONCLIENTMETRICS,...)问题
// Initially use the system message font for the GridCtrl font
NONCLIENTMETRICS ncm;
memset(&ncm,0,sizeof(NONCLIENTMETRICS));
ncm.cbSize = sizeof(NONCLIENTMETRICS);
#if (WINVER >= 0x0600)
ncm.cbSize -= 4; //<== ADD HERE!!
#endif
BOOL f = SystemParametersInfo(SPI_GETNONCLIENTMETRICS,sizeof(NONCLIENTMETRICS), &ncm, 0);
VERIFY(f);
if(f){
memcpy (&m_LogFont, &ncm.lfMessageFont, sizeof (LOGFONT));
m_LogFont.lfHeight = -MulDiv (11, dc.GetDeviceCaps (LOGPIXELSY), 72);
m_LogFont.lfWeight = FW_NORMAL;
m_LogFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
m_LogFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
m_LogFont.lfQuality = DEFAULT_QUALITY;
m_LogFont.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
m_LogFont.lfCharSet = ANSI_CHARSET;
_tcscpy (m_LogFont.lfFaceName, _T ("Courier New"));
}