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

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

讨论了以下主题:

注意

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

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

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

日期和时间选取器 (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 控件会根据用户输入的信息自动更新内部信息。 该控件将以下内容识别为有效输入。

输入类别 说明
箭头键 控件接受箭头键以导航控件中的字段并更改值。 用户可以按 or 键在控件中移动。如果用户尝试按给定方向跳过最后一个字段,则键盘焦点“回绕”到控件对面的字段。 and 键以增量方式更改当前字段中的值。
End 和 Home 该控件接受 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。 显示将如下所示:“4/19/1996”。
DTS_TIMEFORMAT 显示将如下所示:“5:31:42 PM”。

 

自定义格式

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 dddd MMM dd', 'yyyy”。 若要在正文文本中包含单引号,请使用两个连续单引号。 例如,“'Don't forget' MMM dd',' yyyy”生成如下所示的输出:Do not forget Mar 23, 1996。 不必将引号与逗号一起使用,因此“'Don't forget' MMM dd, yyyy“也有效,并生成相同的输出。

回调字段

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

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

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

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

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

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

 

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