月日历控件的属性之一是存储信息(称为控件的日期状态)对于每月的每一天。 此信息用于强调当前显示的月份的某些日期。
注释
对象 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 个)。