CDateTimeCtrl 在 Windows 10 RS2(内部版本 1703)上不显示时间

Posted

技术标签:

【中文标题】CDateTimeCtrl 在 Windows 10 RS2(内部版本 1703)上不显示时间【英文标题】:CDateTimeCtrl does not display time on Windows 10 RS2 (Build 1703) 【发布时间】:2017-02-24 06:39:38 【问题描述】:

我在 MFC 中创建了一个对话框,并使用CDateTimeCtrl 显示/设置时间。直到 Windows 10 Build 10240 显示正确的时间,但是一旦您进行了 Windows 的最新更新,CDateTimeCtrl 将显示空白值。

使用的字体是“MS Shell Dlg”。

我的问题是为什么CDateTimeCtrl 在 Windows 10 RS2(Build 1703)上显示空白值,即使时间已设置。 Windows 10 不支持“MS Shell Dlg”字体还是有其他原因?

以下是代码:

SYSTEMTIME systime;
long lStyle;
CFont Fontvar;
CDateTimeCtrl m_DateTimeCtrl

GetLocalTime(&systime);

lStyle = ::GetWindowLong(m_DateTimeCtrl.m_hWnd, GWL_STYLE);

lStyle |= DTS_TIMEFORMAT;

::SetWindowLong(m_DateTimeCtrl.m_hWnd, GWL_STYLE, lStyle);

Fontvar.CreatePointFont(10, _T("MS Shell Dlg"));

m_DateTimeCtrl.SetFont(&Fontvar);

m_DateTimeCtrl.SetFormat(_T("HH:mm:ss"));

m_DateTimeCtrl.SetTime(&systime);

【问题讨论】:

即使这对你自己来说是显而易见的,但对我来说却不是:你的问题是什么? 我的问题是为什么 CDateTimeCtr 在 Windows 10 RS2 上显示空白值,即使时间已设置。 Windows 10 不支持字体“MS Shell Dlg”还是有其他原因? 据我所知,支持 @Mrunal MS Shell Dlg 。它实际上是一种字体映射到另一种字体。 Windows 10 上的日期时间控制功能。您是否考虑过提供更多信息,例如屏幕截图和相应的代码?想想你可能需要什么来回答某人的问题。 :) 在上述代码中,如果字体未设置为 CDateTimeCtrl,则时间会正确显示在控件中,但如果设置了字体,则 CDateTimeCtrl 不会显示任何内容。有办法解决这个问题吗? 【参考方案1】:

啊,我在 CodeProject 看到了这个,我现在看到的代码可能是我怀疑的那样。

CFont 字体变量;必须在 CDateTimeCtrl m_DateTimeCtrl 的生命周期 >> 从代码中并不清楚这是真的。

CFont 字体变量;在您创建 m_DateTimeCtrl 时有效,但我们不知道该代码是否只是在某个函数中,因此是 CFont Fontvar;位于本地堆栈上,即将消失。

删除该字体也是您的责任。

更新:好吧,我收回他们确实破坏了 MFC。您不能将 CDateTimeCtrl 上的 setfont 与任何字体一起使用,而不仅仅是那个字体。唯一的解决方案是绕过 MFC,直接使用 windows API。

LOGFONT lf;
// clear out structure
memset(&lf, 0, sizeof(LOGFONT));
// request a 12-pixel-height font
lf.lfHeight = 12;
// request a face name "MS Shell Dlg"
_tcsncpy_s(lf.lfFaceName, LF_FACESIZE, _T("MS Shell Dlg"), _tcslen(_T("MS Shell Dlg")));
// create the font
HFONT hfont = ::CreateFontIndirect(&lf);

// Send the WM_SETFONT message to the date time control
m_dateTimeCtrl.SendMessage(WM_SETFONT, (WPARAM)hfont, 1);

【讨论】:

KB4022725(2017 年 6 月 13 日)似乎解决了这个问题 -- support.microsoft.com/en-us/help/4022725/…。

以上是关于CDateTimeCtrl 在 Windows 10 RS2(内部版本 1703)上不显示时间的主要内容,如果未能解决你的问题,请参考以下文章

MFC 把CString格式的时间添加到时间控件(CDateTimeCtrl)中去

如何在 CDateTimeCtrl 中居中对齐文本?

CDateTimeCtrl总是默认值

MFC:你能在 CDateTimeCtrl 中改变旋转的加速度吗?

在 VC++ 6 中将数据从 CDateTimeCtrl 移动到 CTime 对象

CDateTimeCtrl类型的日期如何比较大小