📄 18.1.5 时钟控件的实现.txt
字号:
18.1.5 时钟控件的实现
下面继续完成Clock控件的实现,让该控件显示系统当前时间,这可以在CClockCtrl类的OnDraw函数中完成。这时,该函数中已经自动生成了两行代码,分别用来填充控件的背景和绘制椭圆,我们先将这两行代码注释起来,然后添加下述如例 18-2所示代码中加灰显示的代码。
例18-2
void CClockCtrl :: OnDraw (CDC* pdc , const CRect& rcBounds , const CRect& rclnvalid)
/ / TODO : Replace the following code with your own draw工ng code.
//pdc->FIllRect(rcBounds, Brush : : FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH))) ; // pdc->Ellipse(rcBounds);
CTime time=CTime::GetCurrentTime() ;
CString str=time.Format("%H:%M:%S" ) ;
pdc->TextOut(0 , 0, str);
如果想要获得当前系统时间,可以使用CTime类的静态方法: GetCurrentTime,该函数将返回表示系统当前时间的CTime对象,之后就可以利用CTime对象的Format方法对得到的CTime类型的时间进行格式化,返回一个CString对象,然后将表示时间的字符串显示在控件窗口中。当控件需要刷新时,就会调用OnDraw函数,并传递一个CDC*类型的指针变量,在此函数中就可以利用该指针完成窗口的绘制工作。本例利用该指针在控件窗口 (0, 0)位置处显示格式化后得到的时间字符串。
在VC++开发环境中,利用Build命令生成Clock控件程序,井运行该程序,因为先前我们已经选定了ActiveX Control Test Container应用程序来执行该控件,所以这时会自动启动该程序,然后利用【Edit飞Insert New Con位01..】菜单项插入Clock控件,这时就可以看到在Clock控件的窗口上显示了系统的当前时间,如图 18.21所示。
图 18.21控件窗口上显示系统当前时间
可是,这时控件显示的时间是静止的,为了让该时间"动起来飞前面介绍过解决方法,就是设置一个定时器,让它每隔一秒钟发送一个 WM TIMER消息,在响应该定时器的消息处理函数中,让该控件刷新,重新输出当前系统时间。另外,根据前面的知识,我们知道可以在控件窗口创建完成之后设置定时器,为此我们需要为 CClockCtrl类增加 WM CREATE消息的处理函数,然后在此函数中,在控件窗口创建完成之后,调用SetTimer函数创建定时器。具体代码如例 18-3所示。
例 18-3
int CClockCtrl : :OnCreate(LPCREATESTRUCT 1pCreateStruct)
if (ColeControl :: OnCreate(lpCreateStruct) -1)
return -1;
11 TODO : Add your specialized creation code here
SetTimer(1 , 1000 , NULL) ;
return 0;
接下来,再为 CC1ockCtr1类增加 Windows消息: WM TIMER的处理,在其响应函数 OnTimer中调用 Invalidate函数,使窗口无效,这样就可以使窗口重绘。具体实现代码如例 18-4所示。
19IJ 18-4
void CClockCtrl : : OnT工mer(U工NT nIDEvent)
11 TODO: Add your message handler code here and/ or call defaul t
Invalidate ( ) ;
COleControl: : OnTi mer(n工DEvent) ;
Build井运行 Clock控件,在随后打开的 ActiveX Control Test Container应用程序中插入该控件,将会看到这时这个时钟控件显示的时间随系统当前时间而变化了。
另外,还可以调用另一个函数让控件窗口重绘,这个函数是 InvalidateControl,这是 COleContro1类的一个成员函数,该函数的原型声明如下所示:
void InvalidateControl( LPCRECT lpRect = NULL );
调用 InvalidateContro1函数可以强制控件重绘自身,如果它的参数是 NULL.那么整个控件都将被重绘。因此,在上述代码中,可以将 Invalidate函数替换为InvalidateControl函数。然后,读者可以测试程序,将会发现 C10ck控件显示的结果是一样的。当然,也可以在 VB中测试这个 Clock控件,会看到同样的结果。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -