Вот интересная проблема, с которой я столкнулся. Я использовал MCN_GETDAYSTATE
a> обработчик событий с моим CMonthCalendarControl
уже несколько лет без проблем. Обработчик выглядит так:
void CHomeAwayMaintPage::OnGetDayStateCalendar(NMHDR* pNMHDR, LRESULT* pResult)
{
NMDAYSTATE *pDayState = (NMDAYSTATE*)pNMHDR;
MONTHDAYSTATE mdState[3]; // last, this, next
COleDateTime datStart(pDayState->stStart);
if (pDayState != nullptr)
{
InitDayStateArray(pDayState->cDayState, mdState, datStart);
pDayState->prgDayState = mdState;
}
*pResult = 0;
}
Это всегда работало нормально. Календарь в окне выглядит так:
Теперь, за последние два дня, я обновил это окно, чтобы оно поддерживало изменение размера, и поэтому я настроил календарь для изменения размера. Пример:
Я настроил обработчик событий (поскольку у нас потенциально может быть любое количество календарей) следующим образом:
void CHomeAwayMaintPage::OnGetDayStateCalendar(NMHDR* pNMHDR, LRESULT* pResult)
{
NMDAYSTATE *pDayState = (NMDAYSTATE*)pNMHDR;
COleDateTime datStart(pDayState->stStart);
DWORD dwCount = MonthCal_GetMonthRange(m_Calender.GetSafeHwnd(), GMR_DAYSTATE, NULL);
MONTHDAYSTATE *pmdState = new MONTHDAYSTATE[dwCount];
if (pDayState != nullptr)
{
InitDayStateArray(pDayState->cDayState, pmdState, datStart);
pDayState->prgDayState = pmdState;
}
delete[] pmdState;
*pResult = 0;
}
Тем не менее, когда я закрываю окно, VS2017 вызывает эту ошибку:
Я попытался закомментировать строку delete[] pmdState;
, и это не имело никакого значения. Я также довольно регулярно получаю эту ошибку при попытке отобразить окно:
Если я сбросил динамический макет для элемента управления календарем, чтобы просто переместить элемент управления, а не изменить его размер (чтобы был виден один месяц), и вернуть обработчик событий дневного состояния обратно к тому, что было раньше, эти две ошибки исчезнут, и он станет стабильным как раньше.
Так что я делаю неправильно здесь?
Обновлять
Это метод InitDayStateArray
. Просто читает базу данных:
void CHomeAwayMaintPage::InitDayStateArray(int iMonthCount,
LPMONTHDAYSTATE pDayState, COleDateTime datStart)
{
int iStartMonth, iLastMonth, iThisMonth, iMonth = 0;
COleDateTime datDay;
COleDateTimeSpan spnDay;
CString strDate;
SCHEDULE_DATA_S *psTalk = NULL;
S_JOURNAL_ITEM *psJournal = NULL; // AJT v11.2.0
if (pDayState != NULL)
{
memset(pDayState, 0, sizeof(MONTHDAYSTATE)*iMonthCount);
spnDay.SetDateTimeSpan(1,0,0,0);
datDay = datStart;
iStartMonth = datStart.GetMonth();
iThisMonth = iStartMonth;
iLastMonth = iThisMonth;
do
{
strDate.Format(_T("%d-%02d-%02d"),
datDay.GetYear(),
datDay.GetMonth(),
datDay.GetDay());
// try to get this entry from map
psTalk = NULL;
m_mapSPTalkDates.Lookup(strDate, (void*&)psTalk);
if (psTalk != NULL && psTalk->uTalkNumber != 1000)
BOLDDAY(pDayState[iMonth], datDay.GetDay());
// AJT v11.2.0
strDate = datDay.Format(_T("%Y-%m-%d"));
psJournal = NULL;
m_mapStrPtrJournalCalendar.Lookup(strDate, (void*&)psJournal);
if (psJournal != NULL)
BOLDDAY(pDayState[iMonth], datDay.GetDay());
datDay = datDay + spnDay;
iThisMonth = datDay.GetMonth();
if (iThisMonth != iLastMonth)
{
iLastMonth = iThisMonth;
iMonth++;
}
} while(iMonth < iMonthCount);
}
}
InitDayStateArray
? А остальной код производить MCVE? Я никогда раньше не видел такого, когда Windows показывает отладочные сообщения о программе, которая закончилась раньше. - person Barmak Shemirani   schedule 22.06.2018