设置月历控件的日状态
月历控件的一个特性是存储一个月的每一天的信息的能力(称为“控件的日状态”)。 此信息用于强调当前所显示月份的特定日期。
注意
CMonthCalCtrl
对象必须具有 MCS_DAYSTATE 样式以显示日状态信息。
日状态信息用一个 32 位数据类型 MONTHDAYSTATE 表示。 MONTHDAYSTATE 位域中的每个位(1 到 31)表示一个月中的每一天的状态。 如果某个位处于打开状态,则以粗体显示对应的那一天,否则将不会突出显示。
有两种设置月历控件的日状态的方法:显式地调用 CMonthCalCtrl::SetDayState 或通过处理 MCN_GETDAYSTATE 通知消息。
处理 MCN_GETDAYSTATE 通知消息
MCN_GETDAYSTATE 消息由控件发送,以确定应如何显示可视月份中的日期。
注意
由于月历控件会缓存可视月份前后的月份,因此每次选择新月份时您将收到此通知。
若要正确处理此消息,则必须确定请求几个月的日状态信息,使用正确的值初始化 MONTHDAYSTATE 结构的数组,并使用新信息初始化相关的结构成员。 以下过程详细介绍了必要步骤,并假定你有一个称为 m_monthcal 的 CMonthCalCtrl
对象和一个 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 天)。