MFC之“数字时钟制作”笔记(一)

来源:互联网 发布:ubuntu登录界面root 编辑:程序博客网 时间:2024/05/16 15:58

替换原始图标:

                 左键Icon ——引入,图标属性——该类型——选对应图像

 

VC6.0中MFC遇到:Cannot open precompiled header file:" ... .pch":No such file or directory.

解决办法:工程——设置——C/C++——分类:预编译的头文件——自动使用预补偿页眉。

如果遇到很多无法查找的未知错误,如:点击错误时进入与所编代码无关的文件时可以尝试删除Debug中的文件重新编译。

 

SetTimer的用法:

在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了。

SetTimer函数的原型为: 

UINT SetTimer(

  UINT nIDEvent,

  UINT nElapse,

  void(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,YINT ,DWORD)

) 

 当使用SetTimer函数的时候,就会生成一个计时器。函数中nIDEvent指的是计时器的标识 ,也就是名字。nElapse指的是时间间隔 ,也就是每隔多长时间触发一次事件。第三个参数是一个回调函数 ,在这个函数里,放入你想要做的事情的代码,你可以将它设定为NULL,也就是使用系统默认的回调函数,系统默认认的是OnTimer函数。

 这个函数怎么生成的呢?你需要在需要计时器的类中生成OnTimer函数:在ClassWizard里,选择需要计时器的类,添加WM_TIMER消息映射,就自动生成OnTimer函数了 。然后在函数里添加代码,让代码实现功能。每隔一段时间就会自动执行一次。 

例: 

SetTimer(1,1000,NULL); 

1:计时器的标识;

1000:时间间隔,单位是毫秒; 

NULL:使用OnTimer函数。 

当不需要计时器的时候调用KillTimer(nIDEvent); 

例如:KillTimer(1); 

1.2 调用回调函数

此方法首先写一个如下格式的回调函数(在SetTimer函数表示回调函数TIMERPROC不为空时,需要调用自定义的回调函数)

void CALLBACK TimerProc(

  HWND hWnd,

  UINT uMsg,

  UINT idEvent,

  DWORD dwTime

);
然后再用SetTimer(1,100,TimerProc)函数来建一个定时器,第三个参数就是回调函数地址。

如果要加入两个或者两个以上的timer怎么办? 

继续用SetTimer函数吧,上次的timer的ID是1,这次可以是2,3,4。。。。 

SetTimer(2,1000,NULL); 

SetTimer(3,500,NULL); 

WINDOWS会协调他们的。当然onTimer函数体也要发生变化,要在函数体内添加每一个timer的处理代码: 

OnTimer(nIDEvent) 

         { 

switch(nIDEvent) 

 { 

case 1:..;  

break; 
case 2:..; 
 break; 
 case 3:..; 
  break; 

} 

}

在使用定时器时注意SetTimer中表示定义时标识的nIDEvent参数,以及OnTimer或自定义的回调函数中nIDEvent参数,还有KillTimer中的这个参数,如果要用它们对特定的定时器进行操作时,注意保持它们的一致。

 

 

获取系统时间

一、使用MFC可以用以下代码得到
CTime time = CTime::GetCurrentTime();   ///构造CTime对象
int m_nYear = time.GetYear();     ///年
int m_nMonth = time.GetMonth();     ///月
int m_nDay = time.GetDay();     ///日
int m_nHour = time.GetHour();     ///小时
int m_nMinute = time.GetMinute();   ///分钟
int m_nSecond = time.GetSecond();   ///秒
我们还可以用CTime::Format函数将CTime对象转换为字符串对象
例如: CString m_strTime = time.Format("%Y-%m-%d %H:%M:%S");
运行结果:m_strTime为 2001-8-1 12:11:05


一、使用MFC的CTime类来得到时间:
    CTime必须调用赋值函数,使用其静态函数来初始化
    例如:
    CTime time=CTime::GetCurrentTime();
    这样就可以直接调用time的内部方法得到你想要的当前的时间了。
   
二、使用MFC的COleDateTime来得到时间:
    同上一样,使用MFC 的COleDataTime来处理当前系统的时间也需要首先使用其静态函数来初始化
    例如:
    COleDataTime time=COleDataTime::GetCurrentTime();
    这样之后就可以直接调用time的所有方法了。

针对上面两种MFC的调用方法,MFC帮他们封装好了显示格式的函数,并且能够直接返回CString的格式。同样,也可以自己指定显示格式,具体的显示情况如下%a:显示星期英文的前面几个字母
%A:显示星期的全部英文名称
%b:显示月份英文的前面几个字母
%B:显示月份的全部英文名称
%c:以百分号的形式显示日期时间如:06/02/25/ 01:13:57
%d:显示月份的序号(01 – 31)
%H:显示时间24小时制(00 – 23)
%I:显示时间12小时制(01 – 12)
%j:显示当前是一年中的第几天(001 – 366)
%m:显示月份序号(01 – 12)
%M:显示分钟(00 – 59)
%p:显示当前时间是上午还是下午 A.M./P.M.
%S:显示秒钟(00 – 59)
%U:显示当前是一年中的第几周(00 – 53)
%w:显示星期的序号(0 – 6; 星期日为 0)
%W:显示当前是一年中的第几周(00 – 53)
%x:以百分号的形式显示日期 如:06/02/25/
%X:以冒号的形式显示时间 如:01:12:45
%y:两位显示年号(00 – 99)
%Y:四位显示年号
%#c:显示时间 如:Tuesday, March 14, 1995, 12:41:29
%#x:显示时间 如:Tuesday, March 14, 1995
具体的其他参考请查看MSDN上面的说明;
    1.获取系统当前日期

    CTime t = CTime::GetCurrentTime(); //获取系统日期

    //创建CTime类变量t,并将调用函数GetCurrentTime()的返回值赋给变量t.

    2.获得当前日期和时间,并可以转化为 CString

    CTime tm=CTime::GetCurrentTime(); CString str=tm.Format("%Y-%m-%d");//显示年月日

    或者:CTime tm=CTime::GetCurrentTime().Format("%Y-%m-%d");//显示年月日

 

小结:MFC数字时钟的关键在于创建一个计数器

BOOL CMFCDlg::OnInitDialog()      //初始化函数 

{  

SetTimer(1,1000,NULL);//在这里设置计数器

}

 

void CMFCDlg::OnTimer(UINT nIDEvent)
{
  CTime time = CTime::GetCurrentTime();
 CString str;
 str=time.Format("%H:%M:%S(%Y-%m-%d)");
 SetDlgItemText(IDC_curtime,str);//在名为IDC_curtime的控件里显示字符串str
 CDialog::OnTimer(nIDEvent);
}

void CMFCDlg::Onexitbit()
{
 CDialog::OnCancel();//退出对话框
 KillTimer(1);//在退出软件时要删掉这个计数器
 }

在Release模式下编译链接成的文件时经过优化的,是正式发布产品;而Debug下的只是调试程序。在工程目录下即可找到这两个文件夹。

0 0
原创粉丝点击