Установка состояния дня в элементе управления "Календарь на месяц"
Одним из атрибутов элемента управления календарем месяца является возможность хранения информации, называемой состоянием дня элемента управления для каждого дня месяца. Эта информация используется для выделения определенных дат текущего месяца.
Примечание.
Объект CMonthCalCtrl
должен иметь стиль MCS_DAYSTATE для отображения сведений о состоянии дня.
Сведения о состоянии дня выражаются как 32-разрядный тип данных, MONTHDAYSTATE. Каждый бит в битовом поле MONTHDAYSTATE (от 1 до 31) представляет состояние дня в месяц. Если бит включен, соответствующий день будет отображаться полужирным шрифтом; в противном случае он будет отображаться без выделения.
Существует два метода настройки состояния календаря месяца: явным образом с вызовом CMonthCalCtrl::SetDayState или путем обработки сообщения уведомления MCN_GETDAYSTATE.
Обработка сообщения уведомления MCN_GETDAYSTATE
Сообщение MCN_GETDAYSTATE отправляется элементом управления, чтобы определить, как должны отображаться дни в течение видимых месяцев.
Примечание.
Так как элемент управления кэширует предыдущие и следующие месяцы в отношении видимого месяца, вы будете получать это уведомление каждый раз при выборе нового месяца.
Чтобы правильно обработать это сообщение, необходимо определить, сколько месяцев запрашивается информация о состоянии дня, инициализировать массив структур MONTHDAYSTATE соответствующими значениями и инициализировать связанный элемент структуры с новыми сведениями. В следующей процедуре предполагается, что у вас есть CMonthCalCtrl
объект с именем m_monthcal и массив объектов MONTHDAYSTATE, mdState.
Обработка сообщения уведомления MCN_GETDAYSTATE
С помощью мастера классов добавьте обработчик уведомлений для сообщения MCN_GETDAYSTATE в объект m_monthcal (см. раздел "Сопоставление сообщений с функциями").
В тексте обработчика добавьте следующий код:
LPNMDAYSTATE pDayState = reinterpret_cast<LPNMDAYSTATE>(pNMHDR); int iMax = pDayState->cDayState; for (int i = 0; i < iMax; i++) { pDayState->prgDayState[i] = (MONTHDAYSTATE)0; // init to 0 pDayState->prgDayState[i] |= 0x01 << 14; // set 15th bit to 1 }
Пример преобразует указатель pNMHDR в правильный тип, а затем определяет, сколько месяцев запрашиваются (
pDayState->cDayState
). Для каждого месяца текущий битфилд (pDayState->prgDayState[i]
) инициализируется до нуля, а затем устанавливаются необходимые даты (в данном случае 15-е число каждого месяца).