网格控制:运行时在Visual Studio 2008中的Windows XP上运行时出错

时间:2011-04-27 11:11:56

标签: windows-7 windows-xp grid controls

操作系统: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
}

提前谢谢!!

2 个答案:

答案 0 :(得分:1)

在将项目从VC6移植到VS2012时,我遇到了与 CGridCtrl 相同的问题。

在项目中将_WIN32_WINNT设置为您希望应用程序支持的最低目标平台。这是XP SP1的0x0501 CGridDefaultCell 中不需要更改代码。

MSDN上的

Related discussion

答案 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"));
        }