Skip to content

日期时间选择器控件 (SDateTimePicker)

Warning

The current page still doesn't have a translation for this language.

You can read it through google translate.

SOUI中的日期时间选择器控件,用于方便用户选择日期和时间。支持多种格式显示,可以选择是否显示时间部分。

基本信息

  • 类名SDateTimePicker
  • 控件标签datetimepicker
  • 基类SWindow
  • 功能:提供日期和时间的选择功能

属性说明

该控件在 Ctrl.xml 中没有定义特殊属性,继承自 SWindow 的通用属性。

使用示例

基础日期时间选择器

<!-- 基础日期时间选择器 -->
<datetimepicker pos="10,10,200,35" name="datetime_basic" />

事件处理

日期时间选择器控件支持以下事件:

事件名 EventID 说明
EVT_DT_DATETIMECHANGED EventDtDateTimeChanged::EventID 日期时间改变事件
// 事件处理示例
EVENT_MAP_BEGIN()
    EVENT_NAME_HANDLER(L"datetime_basic", EventDtDateTimeChanged::EventID, OnDateTimeChanged)
EVENT_MAP_END()

void OnDateTimeChanged(IEvtArgs *pEvt)
{
    EventDtDateTimeChanged *pRealEvt = sobj_cast<EventDtDateTimeChanged>(pEvt);
    SYSTEMTIME st = pRealEvt->st;
    // 处理日期时间改变事件
}

代码操作

// 查找日期时间选择器控件
SDateTimePicker *pPicker = FindChildByName2<SDateTimePicker>(L"datetime_basic");

// 设置时间
SYSTEMTIME st = {0};
GetLocalTime(&st);
pPicker->SetTime(&st);

// 获取时间
SYSTEMTIME currentSt = {0};
pPicker->GetTime(&currentSt);

// 设置日期格式
pPicker->SetAttribute(L"font", L"size:14");
pPicker->SetAttribute(L"colorText", L"#333333");

最佳实践

  1. 格式统一:在应用程序中保持日期时间格式的一致性
  2. 用户体验:提供清晰的默认值和合适的尺寸
  3. 事件处理:正确处理日期时间改变事件,及时响应用户操作

常见问题

Q: 日期时间格式不正确怎么办?

A: 通过设置字体和颜色等通用属性调整显示效果。

Q: 日期时间改变事件不触发怎么办?

A: 确保正确订阅了 EVT_DT_DATETIMECHANGED 事件。

Q: 如何设置默认日期时间?

A: 通过代码调用 SetTime 方法设置默认值。

代码示例解析

让我们看一个更复杂的日期时间选择器示例:

// 头文件包含
#include <core/SWindow.h>
#include <control/SDateTimePicker.h>

class CMainDlg : public SHostWnd
{
protected:
    // 日期时间选择器相关变量
    SDateTimePicker *m_pDateTimePicker;

    void OnInit()
    {
        // 获取日期时间选择器控件
        m_pDateTimePicker = 
            FindChildByName2<SDateTimePicker>(L"datetime_demo");

        if(m_pDateTimePicker)
        {
            // 设置初始时间为当前时间
            SYSTEMTIME st = {0};
            GetLocalTime(&st);
            m_pDateTimePicker->SetTime(&st);

            // 设置可选范围
            SYSTEMTIME stMin = {0}, stMax = {0};

            // 设置最小日期为当前日期
            GetLocalTime(&stMin);

            // 设置最大日期为一年后
            GetLocalTime(&stMax);
            stMax.wYear += 1;

            m_pDateTimePicker->SetRange(&stMin, &stMax);

            // 订阅时间变化事件
            m_pDateTimePicker->GetEventSet()->subscribeEvent(
                EventDateTimeChanged::EventID,
                Subscriber(&CMainDlg::OnDateTimeChanged, this));
        }
    }

    // 时间变化事件处理
    bool OnDateTimeChanged(EventDateTimeChanged *pEvt)
    {
        if(!pEvt) return true;

        SDateTimePicker *pPicker = 
            sobj_cast<SDateTimePicker>(pEvt->sender);
        if(!pPicker) return true;

        SYSTEMTIME st;
        if(pPicker->GetTime(&st))
        {
            // 格式化时间字符串
            SStringT strTime;
            strTime.Format(L"%04d年%02d月%02d日 %02d:%02d:%02d",
                st.wYear, st.wMonth, st.wDay,
                st.wHour, st.wMinute, st.wSecond);

            // 更新显示
            SStatic *pText = FindChildByName2<SStatic>(L"text_time");
            if(pText)
            {
                pText->SetWindowText(strTime);
            }

            // 验证是否在有效范围内
            SYSTEMTIME stMin, stMax;
            if(pPicker->GetRange(&stMin, &stMax))
            {
                // 比较日期
                FILETIME ftCurrent, ftMin, ftMax;
                SystemTimeToFileTime(&st, &ftCurrent);
                SystemTimeToFileTime(&stMin, &ftMin);
                SystemTimeToFileTime(&stMax, &ftMax);

                if(CompareFileTime(&ftCurrent, &ftMin) < 0 ||
                   CompareFileTime(&ftCurrent, &ftMax) > 0)
                {
                    // 超出范围,恢复到有效值
                    pPicker->SetTime(
                        CompareFileTime(&ftCurrent, &ftMin) < 0 
                        ? &stMin : &stMax);
                }
            }
        }

        return true;
    }
};

这个示例展示了: 1. 如何初始化日期时间选择器 2. 如何设置和获取时间 3. 如何设置和验证时间范围 4. 如何处理时间变化事件