关于日期和时间选取器控件

DTP) 控件 (日期和时间选取器提供了一个简单直观的界面,用于与用户交换日期和时间信息。 例如,使用 DTP 控件,可以要求用户输入日期,然后轻松检索所选内容。

本文讨论了以下主题:

备注

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

该控件基于 1753 年引入的公历。 它不会计算与 Julian 日历一致的日期。

日期和时间选取器用户界面

日期和时间选取器 (DTP) 控件的工作区显示日期或时间信息,并充当用户修改信息的界面。 可以从日历中选择日期,也可以使用向上控件选择日期;可以通过在控件 的格式字符串定义的字段中键入内容来更改时间。 (可选)控件显示复选框。 选中时,可以检索控件中的值;否则,该控件被视为未初始化。

下图显示了包含三个日期选取器控件的窗口。 第一个日期选取器控件是使用 DTS_SHOWNONE 样式创建的,第二个具有 DTS_UPDOWN 样式,第三个控件没有特殊样式。 在第三个控件中,用户已单击向下箭头以显示日历。

screen shot of a window that demonstrates three styles of date-picker controls

下图显示了一个窗口,其中包含三个包含时间的控件。

第一个控件已使用 DTS_TIMEFORMAT 样式创建,并在默认时间显示时间,其中包含四个字段。 用户可以在任何这些字段中键入有效值,或使用向上控件或箭头键选择字段并更改值。

第二个控件显示使用 DateTime_SetFormat设置的自定义格式。 与第一个控件一样,用户可以通过键入或使用箭头键更改时间字段。 可以通过从日历中选择一个日期,当用户单击向下箭头时打开的日历来更改星期几。

第三个控件显示如何将任意文本添加到控件。 用户可以通过键入、使用箭头键或使用向上控件,从 1 到 24) 选择一小时 (。

screen shot of a window that shows three controls that contain the time

DTP 控件会根据用户的输入自动更新内部信息。 该控件将以下内容识别为有效输入。

输入类别 说明
箭头键 控件接受箭头键以导航控件中的字段并更改值。 用户可以按或键在控件中移动。如果用户尝试在给定方向上移动最后一个字段,键盘焦点“环绕”到控件对面的字段。 键以增量方式更改当前字段中的值。
结束和开始 该控件接受VK_END和VK_HOME虚拟键,以分别将当前字段中的值更改为其上限和下限。
函数键 密钥激活编辑模式。 该键会导致控件显示下拉月日历控件, (按此操作以及) 。
数字 该控件接受两个字符段的数字输入。 如果用户输入的值 (无效,例如将月份设置为 14) ,控件将拒绝它,并将显示重置为上一个值。
加号和减号 该控件接受数字键盘中的VK_ADD和VK_SUBTRACT虚拟键,以递增和递减当前字段中的值。

 

不使用 DTS_UPDOWN 样式的 DTP 控件显示箭头按钮。 如果用户单击此按钮,则月历控件会下拉。 用户可以通过单击日历的区域来选择特定日期。

日期和时间选取器控件样式和格式

日期和时间选取器 (DTP) 控件具有多个 日期和时间选取器控件样式 ,用于确定控件的外观和行为。 使用 CreateWindowExdwStyle 参数创建控件时指定样式。 若要在创建控件后检索或更改窗口样式,请使用 GetWindowLongSetWindowLong

预设格式

有三种预设格式可用于显示日期,一种用于显示时间。 通过选择以下窗口样式之一来设置这些格式。

格式 说明
DTS_LONGDATEFORMAT 该显示器将如下所示:“1996年4月19日星期五”。
DTS_SHORTDATEFORMAT 显示如下所示:“4/19/96”。
DTS_SHORTDATECENTURYFORMAT 版本 5.80。 显示如下所示:“1996/4/19”。
DTS_TIMEFORMAT 显示如下所示:“下午 5:31:42”。

 

自定义格式

DTP 控件依赖于格式字符串来确定它将如何显示信息字段。 如果预设格式不够,可以通过定义自己的格式字符串创建自定义格式。 自定义格式为应用程序提供了更大的灵活性。 通过它们可以指定控件显示信息字段的顺序。 可以包含正文文本以及用于从用户请求信息的回调字段。 创建字符串后,可以使用 DTM_SETFORMAT 消息将其分配给 DTP 控件。

格式字符串

DTP 格式字符串包含表示特定信息并定义其显示格式的一系列元素。 元素将以格式字符串中显示的顺序显示。

日期和时间格式元素将替换为实际日期和时间。 它们由以下字符组定义。

元素 说明
"d" 一位数或两位数的一天。
“dd” 两位数的日期。 单位数日值前面有一个零。
“ddd” 三个字符的工作日缩写。
“dddd” 完整的工作日名称。
“h” 采用 12 小时格式的一位数或两位数小时。
“hh” 采用 12 小时格式的两位数小时。 单位数值前面为零。
“H” 采用 24 小时格式的一到两位数小时。
“HH” 采用 24 小时格式的两位数小时。 单位数值前面为零。
“m” 一位数或两位数分钟。
“mm” 两位数分钟。 单位数值前面为零。
“M” 一位数或两位数的月份数。
“MM” 两位数的月份数。 单位数值前面为零。
“MMM” 三个字符的月份缩写。
“MMMM” 完整月份名称。
“t” 一个字母 AM/PM 缩写 (即 AM 显示为“A”) 。
“tt” 两个字母 AM/PM 缩写 (即 AM 显示为“AM”) 。
“yy” 1996年 (的最后两位数字将显示为“96”) 。
“yyyy” 1996年全年 (将显示为“1996”) 。

 

若要使信息更具可读性,可以通过将正文文本括在单引号中,将正文文本添加到格式字符串。 无需引用空格和标点符号。

备注

不用单引号分隔的非格式字符将导致 DTP 控件不可预知的显示。

例如,若要显示格式为“'Today is: 04:22:31 Tuesday Mar 23, 1996”的当前日期,格式字符串为“'Today is: 'hh':'m':'s ddd MMM dd', 'yy”。 若要在正文文本中包含单引号,请使用两个连续单引号。 例如,“不要忘记 MMM dd','yyyy”生成如下所示的输出:不要忘记 1996 年 3 月 23 日。 不必将引号与逗号一起使用,因此“不要忘记”MMM dd,yyy“也有效,并生成相同的输出。

回调字段

除了标准 格式字符串 和正文文本之外,还可以将显示的某些部分定义为 回调字段。 这些字段可用于查询用户以获取信息。 若要声明回调字段,请在格式字符串中的任何位置 (ASCII Code 88) 包含一个或多个“X”字符。 可以通过重复“X”字符来创建具有唯一标识的回调字段。 因此,格式字符串“XX dddd MMM dd”,“yyy XXX”包含两个唯一回调字段“XX”和“XXX”。 与其他 DTP 控件字段一样,回调字段按格式字符串中的位置按从左到右的顺序显示。

当 DTP 控件分析格式字符串并遇到回调字段时,它会发送 DTN_FORMATDTN_FORMATQUERY 通知代码。 与回调字段对应的格式字符串元素包含在通知中,以允许接收应用程序确定正在查询的回调字段。 控件的所有者必须响应这些通知,以确保正确显示自定义信息。

日期和时间选取器控制通知消息

当 DTP) 控件接收用户输入或进程并响应回调字段时,日期和时间选取器 (DTP) 控件发送通知代码。 控件的父级以 WM_NOTIFY 消息的形式接收这些通知代码。

以下通知代码用于 DTP 控件。

通知代码 说明
DTN_CLOSEUP 指示即将删除下拉月日历。
DTN_DATETIMECHANGE 向 DTP 控件中的更改发出信号。
DTN_DROPDOWN 指示下拉月日历即将显示。
DTN_FORMAT 请求文本以描述为回调字段的格式字符串的一部分显示。
DTN_FORMATQUERY 请求有关要在回调字段中显示的文本的最大允许大小的信息。
DTN_USERSTRING 向控件中的用户编辑操作的结束发出信号。 此通知仅由使用 DTS_APPCANPARSE 样式的 DTP 控件发送。
DTN_WMKEYDOWN 指示用户在 DTP 控件的回调字段中按下了一个键。

 

日期和时间选取器控件参考