在收到WM_TIMER讯息後,DIGCLOCK的视窗程序呼叫InvalidateRect简单地使整个视窗无效。这不是最佳方法,因为每秒整个视窗都要被擦除和重画,有时会引起显示器的闪烁。依据目前的时间使视窗需要更新的部分无效是最好的解决方法。然而,在逻辑上这样做的确很复杂。
在处理WM_TIMER讯息处理期间使视窗无效会迫使所有程式的真正活动转入WM_PAINT。DIGCLOCK在WM_PAINT讯息一开始将映射方式设定为MM_ISOTROPIC。这样,DIGCLOCK将使用水平方向和垂直方向相等的轴。这些轴(由SetWindowExtEx呼叫设定)是水平276个单位,垂直72个单位。当然,这些轴定得有点太随意了,但它们是按照时钟数位元的大小和间距安排的。
DIGCLOCK将视窗原点设定为(138,36),这是视窗范围的中心;将视埠原点设定为(cxClient / 2,cyClient / 2)。这意味著时钟的显示位於DIGCLOCK显示区域的中心,但是该DIGCLOCK也可以使用在显示幕左上角的原点(0, 0)的轴。
然後WM_PAINT将目前画刷设定为之前建立的红画刷,将目前画笔设定为NULL_PEN, 并呼叫DIGCLOCK中的函式DisplayTime。
取得目前时间
DisplayTime函式开始呼叫Windows函式GetLocalTime,它带有一个的SYSTEMTIME结构的参数,在WINBASE.H中定义为:
很明显,SYSTEMTIME结构包含日期和时间。月份由1开始递增(也就是说,一月是1),星期由0开始递增(星期天是0)。wDay成员是本月目前的日子,也是由1开始递增的。
SYSTEMTIME主要用於GetLocalTime和GetSystemTime函式。GetSystemTime函式传回目前的世界时间(Coordinated Universal Time,UTC),大概与英国格林威治