关于月历控件

月历控件可实现类似于日历的用户界面。 这为用户提供了非常直观和可识别的输入或选择日期的方法。 通过使用现有数据类型,该控件还为应用程序提供了在控件中获取并设置日期信息的方法。

月历控件功能

以下屏幕截图显示了一个大小已被调整为可显示两个月的月历控件。

screen shot of a dialog box with a month calendar control showing two months, side by side

注意

月历控件的外观和行为在不同版本的运行库中略有不同。 本主题主要介绍在 Windows Vista 中使用 Comctl32.dll 版本 6 时出现的控件。

 

图中的控件具有以下可选功能。

  • 当前日期显示在控件底部的单独一行上。 这是默认样式。
  • “今日圆圈”(在此版本中实际上是一个矩形)出现在当前日期周围,在“今日”行旁边作为视觉提示。 这是默认样式。
  • 周数显示在每行天数的左侧。 必须指定此样式。
  • 根据应用程序设置的日期状态,某些日期会以粗体显示。 例如,已安排会议的日期可能会以粗体显示。 必须指定此样式。

注意

Windows 不支持 1601 之前的日期。 有关详细信息,请参阅 FILETIME

月历控制以 1753 年推出的格里高利历为基础。 它不会计算与 1753 年之前使用的儒略历一致的日期。

 

选择一天

默认情况下,当用户单击月历控件左上角或右上角的箭头按钮时,控件会更新显示内容,以便显示上一个月或下一个月。 用户也可以通过单击第一个月之前和最后一个月之后显示的部分月份来执行相同的操作。

以下键盘命令也可用于移动所选内容。 日历总是根据需要滚动显示所选的日期。 (表中显示了虚拟键代码。)

命令 说明
左箭头 (VK_LEFT) 选择前一天。
右箭头 (VK_RIGHT) 选择下一天。
上箭头 (VK_UP) 选择上一周的同一天。
下箭头 (VK_DOWN) 选择下一周的同一天。
PAGE UP (VK_PRIOR) 选择上一个月的同一天。 (如果该月没有对应的一天,则选择最接近的一天;例如,选择从 3 月 31 日移至 2 月 28 日或 29 日。)
PAGE DOWN (VK_NEXT) 选择下一月的同一天。
HOME (VK_HOME) 选择当前月份的第一天。
END (VK_END) 选择当前月份的最后一天。
CTRL + HOME 向后滚动一个月,然后选择最左侧列中的一天。
CTRL + END 向前滚动一个月,然后选择最右侧列中的一天。
Ctrl+PAGE UP 选择上一月的同一天。 选择移动的月数就是控件中显示的月数。 例如,如果显示了两个月,则选择的日期将从 6 月 6 日移至 5 月 6 日。
CTRL + PAGE DOWN 选择上一月的同一天。 选择移动的月数就是控件中显示的月数。 例如,如果显示了两个月,则选择的日期将从 6 月 6 日移至 8 月 6 日。

 

如果月历控件未使用 MCS_NOTODAY 样式,则用户可以通过单击控件底部的“今日”文本返回到当前日期。 如果当前日期不可见,则控件会更新显示内容以显示该日期。

应用程序可以使用 MCM_SETMONTHDELTA 消息或相应的宏 MonthCal_SetMonthDelta 来更改控件更新显示的月数。 但是,无论显示的月数或 MCM_SETMONTHDELTA 设置的值是多少,PAGE UP 和 PAGE DOWN 键都会更改一个所选的月份。

选择非相邻月份

当用户单击所显示月份的名称时,将会列出该年的所有月份(在早期版本中,这是一个弹出式菜单)。 用户可以在列表中选择某个月份。 如果用户选择的月份不可见,则月历控件会滚动其显示内容以显示所选的月份。 在以下屏幕截图中,月历控件显示了两个相邻年份的月份。

screen shot of a dialog box with a month calendar control showing all the months of 2007 and 2008

选择其他年份

如果用户单击年份,则会列出一组年份,用户可以选择不同的年份,如下图所示。

screen shot of a month calendar control showing all years from 1999 to 2020

本地化

月历控件的格式和所有字符串都来自 LOCALE_USER_DEFAULT。

月历控件中的时间

月历控件不显示时间。 但是,用于设置和检索选定日期或今天的日期的 SYSTEMTIME 结构包含了时间字段。 在以编程方式设置日期时,控件要么按原样复制时间字段,要么先验证时间字段,如果无效,则存储当前默认时间。 以下是设置日期的消息列表,以及如何处理时间字段的说明。

消息 说明
MCM_SETCURSEL 该控件会原样复制时间字段,而不会进行验证或修改。
MCM_SETRANGE 传入结构的时间字段将被验证。 如果有效,时间字段将被复制而不进行修改。 如果无效,控件会从今天的数据中复制时间字段。
MCM_SETSELRANGE 传入结构的时间字段将被验证。 如果有效,时间字段将被复制而不进行修改。 如果无效,控件将保留当前选择范围中的时间字段。
MCM_SETTODAY 该控件会原样复制时间字段,而不会进行验证或修改。

 

从控件中检索日期时,时间字段将从存储的时间中复制,而无需进行修改。 控件对时间字段的处理是为了方便程序员。 除上述操作外,控件不会对时间字段进行检查或修改。