Grid Control: Ошибка времени выполнения при запуске в Windows XP в Visual Studio 2008 - PullRequest
0 голосов
/ 27 апреля 2011

ОС: 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 он хорошо работает как в режиме отладки, так и в режиме RELEASE.

  • В Windows XP при запуске exe-файла в папке DEBUG выдается ошибка подтверждения. И когда я запускаю exe-файл в папке RELEASE, элемент управления сеткой не отображается.

  • И я также попытался скомпилировать в XP с Visual Studio, чтобы увидеть, есть ли какая-либо ошибка, но она дает только ошибку во время выполнения.

Ошибка:

Ошибка отладочного подтверждения! Программа: ... Файл: ... / 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 ]

1 голос
/ 01 марта 2013

Я столкнулся с той же проблемой с CGridCtrl при переносе проекта из VC6 в VS2012.

В вашем проекте установите _WIN32_WINNT на самую низкую целевую платформу, которую ваше приложение должно поддерживать. Это 0x0501 для XP SP1. Никаких изменений кода не требуется в CGridDefaultCell .

Похожие обсуждения на MSDN

0 голосов
/ 29 апреля 2011

Ответьте на мой собственный вопрос ...

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