C++自绘DateTime:分段自定义色彩加eee毫秒格式支持

C++自绘DateTime:分段自定义色彩加eee毫秒格式支持

开篇:所有 C++ 桌面开发都会踩的 DateTime 大坑

做上位机、日志监控、时序记录、工业测控、数据溯源类软件的 C++ 开发者,没人能避开系统原生 DateTime 控件的折磨。 看似基础的日期选择、展示控件,实则藏着两大无法绕过的硬伤,无数项目为了适配需求,只能手写复杂自绘逻辑,徒增几十上百行冗余代码,还容易出现渲染闪烁、格式兼容 bug。

吐槽原生 DateTime 两大核心痛点

  1. 全局单色文字,无法区分年、月、日、时、分、秒视觉层级原生 DateTime 所有时间文本统一同一种颜色,yyyy 年、MM 月、dd 日、HH 时、mm 分、ss 秒全部混为一体。
  • 日志界面:无法高亮年份、标红异常秒数,排查时序数据费眼低效;
  • 工业监控界面:关键毫秒、时间节点无法突出,界面毫无层次感;
  • UI 标准化需求:产品设计要求年月区分色彩,原生控件完全不支持,只能弃用重写;
  • 二次开发成本:想要分段上色,需要拆解日期字符串、逐段绘制文本、处理坐标对齐,极易出现文字错位、渲染卡顿。
  1. 原生控件无毫秒支持,高精度时序场景直接作废系统自带 DateTime 仅支持到秒级格式,没有任何内置毫秒标识,对于高精度场景是致命短板:
  • 设备采集、传感器日志、高速数据流需要精确到千分之一秒记录;
  • 时序对比、故障溯源、延时测试缺少毫秒维度,数据精度不足;
  • 开发者只能拼接文本框 + 隐藏控件组合实现,多控件联动极易出现同步误差、输入格式校验漏洞;
  • 组合控件代码耦合严重,后期维护、移植项目成本极高。

这是默认的DateTime控件

开发目标:解决分段上色和毫秒级显示

这是自绘后的DateTime控件

上图我们可以看出旧控件和新控件的明显差距。现在我们就来讲实现过程。

开发环境:VS2019

界面库:酷宝-001-选驱者 下载地址:库来帮 www.kulb.cn

接入方法我前面有讲这里就不再重述。

首先是DateTime的指令

关于时间日期命令转换的解释;
yyyy 4年份 如:2058;
yyy 4年份 如:2058;
yy 2年份 如:58;
y 2年份 如:58;
MMMM 完整月 如:十二月;
MMM 缩写月 如:2月;
MM 满位月 01-12 如:02;
M 占位月 1-12 如:2;
dddd 完整星期几 如:星期六;
ddd 缩写周几 如:周六;
dd 满位日 01-31 如:09;
d 占位日 1-31 如:9;
HH (24小时制) 满位时 00-23 如:09;
H (24小时制) 占位时 0-23 如:9;
hh (12上时制) 满位时 01-12 如:09;
h (12小时制) 占位时 1-12 如:9;
mm 满位分 00-59 如:09;
m 占位分 0-59 如:9;
ss 满位秒 00-59 如:09;
s 占位秒 0-59 如:9;
tt AM/PM完整 上下午 如:上午;
t AM/PM缩写 上下午 如:上;
eee 满位毫秒 000-999 如:009;
e 占位毫秒 0-999 如:9;
X 回调字段;
单引号标记部份默认显示为字符串 如:'yyyy' 这样就不会转换为年份;
常用时间格式年月日:yyyy年MM月dd日 yyyy/MM/dd yyyy-MM-dd
常用时间格式时分秒:HH时mm分ss秒 HH:mm:ss
常见完整时间格式:yyyy-MM-dd HH:mm:ss

关键结构:

typedef structKB_DTDateTimeColor
{
DWORDclrText;//文本颜色
DWORDclrEnable;//禁用文本颜色 禁用色默认不启用阴影
DWORDclrSBG;//选中背景色
DWORDclrSText;//选中文本色 选中色默认不启用阴影
//-------------------------------
DWORDclrYear;//年-色彩
DWORDclrMonth;//月-色彩
DWORDclrDayofWeek;//星期几-色彩
DWORDclrDay;//日-色彩
DWORDclrHour;//时-色彩
DWORDclrMinute;//分-色彩
DWORDclrSecond;//秒-色彩
DWORDclrMS;//毫秒-色彩
DWORDclrAPM;//上下午-色彩
DWORDclrCallback;//回调-色彩
//--------------------------------
BOOLBCloseShadow;//当这个值为TRUE时强制关闭字体阴影(有些时候界面库会配置让字体显示阴影)
KB_DTDateTimeColor()
{
ZeroMemory(this,sizeof(KB_DTDateTimeColor));
}
}KB_DTDATETIMECOLOR;

关键函数:

//获取DateTime当前控件的颜色配置
//hWnd:控件句柄
//clrbuf:保存控件当前的色彩配置信息
//反回值:成功反回TRUE 失败反回FALSE

KBLIBRARYAPIBKB_GetDateTimeColor(HWNDhWnd,KB_DTDateTimeColor&clrbuf);

//设置DateTime当前控件的颜色配置
//hWnd:控件句柄
//clr:须要替换的色彩信息
//反回值:成功反回TRUE 失败反回FALSE

KBLIBRARYAPIBKB_SetDateTimeColor(HWNDhWnd,const KB_DTDateTimeColor&clr);

颜色自定

关键指令:

eee 满位毫秒 000-999 如:009;
e 占位毫秒 0-999 如:9;

毫秒支持

Demo我已上传,有不理解的地方可自行查看源码。