您的位置:首页 > 其它

MFC中定时器及时间显示

2014-01-10 22:38 344 查看
本次设计中将会使电脑的系统时间显示到窗口,主要是用于FTP中与定时上传时间做对比。使用者设置上传时间,当本地时间到达时间时,触发函数,将文件进行上传。
显示时间之前需要了解消息响应。在MFC中可以自己设定消息,当触发时自动处理。本次设计中用到了定时器,SetTimer,该函数是CWnd类中的定时器,参数有三个,比如SetTimer(1,1000,NULL);前面的1代表的是定时器的标号,可以同时定义好几个定时器,不同的定时器就对应不同的标号。第二个参数是说每1000毫秒触发一次消息,向消息响应函数发送消息让其处理,这时就涉及到另一个函数,消息响应函数,OnTimer,它是重载的CWnd中的函数,跟SetTimer相对应,每当定时器触发一次,它就会执行一次,这个函数不能自己定义,需要在类向导中的消息中找到WM_TIMER消息,对其添加消息处理,这样就建立了一个消息映射机制,包括消息申明,消息映射,和消息实现,咱么前两个在对WM_TIMER添加消息处理函数后,就已经被设置好。这个函数的形参就对应着上面定时器的标号,在OnTime函数中用一个switch语句就可以对不同的定时器进行操作处理。然后就是对响应函数处理,用到的类是MFC的CTime类,它里面有关于时间的一些处理,可以在MSDN中查看,本例用的显示年月日时分秒,每1s刷新一次,使用的控件是Static那种静态的,然后将其ID改为ID_TIMER,在显示的时候将其与时间变来那个绑定即可显示。获取时间是使用的CTime类中的GetCurrentTime()函数,他是windows中获取时间函数GetTickCount()的预定义,其实是同一个函数,第一次见到这个函数是在编程之美的第一章,获取规定使用百分比的CPU。这个函数获取的是系统开始启动到调用这个函数时经过的毫秒数,其返回值类型为DWORD,调用这个函数两次并相减,就可以获取任何一段程序执行的毫秒数,当然时间只能精确到毫秒单位。
用GetCurrentTime()获取时间后需要将其转化为想要的显示格式,用Format进行显示处理,
CTime t=CTime::GetCurrentTime();
       CString sDate;//显示时间串
       sDate=t.Format("%y年%m月%d日");
通过这种转化可以转变为年月日的格式,另外通过GetDayOfWeek()
来获取到底是星期几,其返回值是int型的1-7,分别对应星期日到星期六,类似的时分秒的获取跟年月日雷同。然后将这三种时间分别串接起来,使用SetDlgItemText将时间显示到空间中,下面是简单的代码。
CTime t=CTime::GetCurrentTime();     CString sDate;
       sDate=t.Format("%y年%m月%d日");
       inti=t.GetDayOfWeek();
       switch(i)
       {
       case 1:
              sDate=sDate+" 星期日";
              break;
       case 2:
              sDate=sDate+" 星期一";
              break;
       case 3:
              sDate=sDate+" 星期二";
              break;
       case 4:
              sDate=sDate+" 星期三";
              break;
       case 5:
              sDate=sDate+" 星期四 ";
              break;
       case 6:
              sDate=sDate+" 星期五";
              break;
       case 7:
              sDate=sDate+"星期六 ";
              break;
       }
       CString sTime;
       sTime=t.Format("%H:%M:%S");
       sDate=sDate+sTime;
       SetDlgItemText(IDC_TIMER,sDate);
在使用时还会牵涉到另一个问题,这个定时器应该放到哪个地方。在这之前需要了解一下构造函数与窗口类中另一个初始化函数OnInitDialog的区别,他们都是初始化的。区别就是前和后的问题,构造函数用于创建类之处对变量的初始化,这是这个类其实并未创建,类的创建循序就是变量声明然后执行构造函数,这时所有的方法其实都未声明,那么有关这个类的窗口及控件肯定还是尚未创立,即构造函数是窗口类创建之前的初始化,与它相反,OnInitDialog的初始化是发生在窗口及其控件都创建完成后,所有有关窗口类的初始化都应该在这里面初始化,这就是有了构造函数还需要OnInitDialog函数的原因,本次设计中的定时器要调用消息响应函数刷新窗口中时间的显示,故应该放在OnInitDialog函数中,若放在构造函数中,为尚未创建的控件赋值,就会出现读写错误。若是自己创建的新类,并没有OnInitDialog,这需要在类向导的虚函数一览中找到它并重载即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: