CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

状态栏显示时间

楼主ietj(萧枫)2002-03-13 13:41:07 在 VC/MFC / 基础类 提问

我在状态栏中使用定时器,,却总是出现unhandle   except   kernel32.exe     ........  
  我是在oncreate()函数中使用  
      SetTimer(0,1000,NULL);  
  在ontimer()中  
        CTime   time=CTime.GetCurrentTime();  
        CString   s=time.Format("%H:%M:%S"):  
        m_wndStatusBar.后面的我不记得了,应没错,  
  在字符中定义  
      ID_CLOCK      
  在indicators数组中也定义了, 问题点数:20、回复次数:9Top

1 楼kaitty(阿凯)回复于 2002-03-13 13:46:56 得分 5

改一下SetTimer(0,1000,NULL);  
  为   SetTimer(1,1000,NULL);试试。  
  Top

2 楼ietj(萧枫)回复于 2002-03-13 13:51:13 得分 0

上铺的老兄请问为什么了,还有就是他们的宽度怎么控制,THANKSTop

3 楼wsa_socket()回复于 2002-03-13 13:56:01 得分 0

Specifies   a   nonzero   timer   identifier.Top

4 楼kaitty(阿凯)回复于 2002-03-13 13:56:51 得分 0

MSDN中明确说明:  
  nIDEvent  
  Specifies   a   nonzero   timer   identifier.  
   
  Top

5 楼kaitty(阿凯)回复于 2002-03-13 14:04:46 得分 0

宽度控制  
  void   SetPaneInfo(   int   nIndex,   UINT   nID,   UINT   nStyle,   int   cxWidth   );  
   
  Top

6 楼Flysnow(飞雪)回复于 2002-03-13 14:17:29 得分 15

在状态条上显示当前时间    
  执行下面五个步骤:  
  编辑资源。添加一个ID为ID_INDICATOR_TIME的新字符串,并将其内容设置为00:00(或者00:00:00)。状态条使用设置的初始值来计算Pane的大小。在应用程序中可以通过调用CStatusBar::SetPaneInfo()函数来动态的改变Pane的大小。保存资源。  
  编辑Mainfrm.cpp。状态条对象使用indicators[]数组中的数据并且按照其在数组中的顺序生成状态条,在indicators[]数组的适当位置插入ID_INDICATOR_TIME。  
  在CMainFrame类中加入下列的消息映射  
  Mainfrm.h  
          //{{AFX_MSG(CMainFrame)  
          afx_msg   void   OnUpdateTime(CCmdUI   *pCmdUI);  
          //}}AFX_MSG  
  Mainfrm.cpp  
          BEGIN_MESSAGE_MAP(CMainFrame,CMDIFrameWnd)  
          //{{AFX_MSG_MAP(CMainFrame)  
          ON_UPDATE_COMMAND_UI(ID_INDICATOR_TIME,OnUpdateTime)  
          //}}AFX_MSG_MAP  
          END_MESSAGE_MAP()  
  由于ID_INDICATOR_TIME是一个ID而不是一个类,所以上述消息映射只能手动加入而不能使用ClassWizard。  
  注意:如果你的程序还需要增加OnTimer函数(使用ClassWizard),那么你应当先使用ClassWizard加入ON_WM_TIMER消息映射,然后再手动加入上述消息映射,如果次序相反,上述消息映射将会被ClassWizard删除掉。  
  编辑Mainfrm.cpp,加入下列函数:  
  void   CMainFrame::OnUpdateTime(CCmdUI   *pCmdUI)  
  {//状态条时间显示函数  
          CTime   t   =   CTime::GetCurrentTime();  
          char   szTime[6];  
          int   nHour   =   t.GetHour();  
          int   nMinute   =   t.GetMinute();  
          if   (nHour   >   12)   nHour   =   nHour   -   12;//如要按24小时制显示,请将此行注释掉  
          wsprintf(szTime,   "%i:%02i",   nHour,   nMinute);//分秒一般习惯用两位表示  
          //把时间写到Pane  
          m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex  
                                  (ID_INDICATOR_TIME),   LPCSTR(szTime));  
          pCmdUI->Enable();  
  }  
  应用程序在有空闲时间(idle   time)时调用这个函数。每当应用程序清空其消息队列时,它将发送一个WM_IDLEUPDATECMDUI消息(新的idle   time)。关于idle   time的更多帮助信息,请参看CWinApp::OnIdle()函数的帮助。  
  到目前为止,程序还存在一个问题:当用户不操作该应用程序时,应用程序接受不到消息,也就谈不上清空消息队列,所以就不会有idle   time,因此显示的时间就不会得到刷新。我们将在第五步中解决这个问题。  
  在CMainFrame类OnCreate()中添加下列语句:  
  m_nIDTimer   =   ::SetTimer(NULL,   0,   1000,   NULL);//发送消息,以便更新状态条时间  
  上述语句每秒钟发送一个消息到应用程序的消息队列,当应用程序清空其消息队列时,时间显示将被更新。在CMainFrame类析构函数中调用::KillTimer(NULL,   m_nIDTimer)  
  更多信息  
  当模式对话框弹出时(例如Help的About对话框),应用程序的消息队列由对话框处理。由于对话框的消息管理不包括idle   time处理,所以OnUpdateTime函数不会被调用。如果你要在应用中使用模式对话框,那么你的项目还要进行下面的改进(加入TimerProc函数以处理WM_TIMER消息):  
  编辑Mainfrm.h和Mainfrm.cpp。在CMainFrame类中加入下列函数的声明及定义:  
  Mainfrm.h  
          static   void   CALLBACK   TimerProc(HWND   hwnd,   UINT   uMsg,   UINT   uIDEvent,  
                                  DWORD   dwTime);  
  Mainfrm.cpp  
          void   CALLBACK   CMainFrame::TimerProc(HWND   hwnd,   UINT   uMsg,  
                                  UINT   uIDEvent,   DWORD   dwTime)  
          {  
                  CMainFrame   *pMainWnd   =   (CMainFrame   *)AfxGetApp()->m_pMainWnd;  
                  ASSERT(uIDEvent   ==   pMainWnd->m_nIDTimer);  
                  CCmdUI   cui;  
                  cui.m_nID   =   ID_INDICATOR_TIME;  
                  cui.m_nIndex   =   4;  
                  cui.m_pMenu   =   NULL;  
                  cui.m_pOther   =   &pMainWnd->m_wndStatusBar;  
                  pMainWnd->OnUpdateTime(&cui);//调用OnUpdateTime()函数,更新时间显示  
          }  
  修改CMainFrame类OnCreate()函数中SetTimer的调用格式:  
  m_nIDTimer   =   ::SetTimer(NULL,   0,   1000,   TimerProc);    
   
   
   
   
  宽度默认就可以了Top

7 楼Flysnow(飞雪)回复于 2002-03-13 14:19:45 得分 0

在状态条上显示当前时间    
  执行下面五个步骤:  
  编辑资源。添加一个ID为ID_INDICATOR_TIME的新字符串,并将其内容设置为00:00(或者00:00:00)。状态条使用设置的初始值来计算Pane的大小。在应用程序中可以通过调用CStatusBar::SetPaneInfo()函数来动态的改变Pane的大小。保存资源。  
  编辑Mainfrm.cpp。状态条对象使用indicators[]数组中的数据并且按照其在数组中的顺序生成状态条,在indicators[]数组的适当位置插入ID_INDICATOR_TIME。  
  在CMainFrame类中加入下列的消息映射  
  Mainfrm.h  
          //{{AFX_MSG(CMainFrame)  
          afx_msg   void   OnUpdateTime(CCmdUI   *pCmdUI);  
          //}}AFX_MSG  
  Mainfrm.cpp  
          BEGIN_MESSAGE_MAP(CMainFrame,CMDIFrameWnd)  
          //{{AFX_MSG_MAP(CMainFrame)  
          ON_UPDATE_COMMAND_UI(ID_INDICATOR_TIME,OnUpdateTime)  
          //}}AFX_MSG_MAP  
          END_MESSAGE_MAP()  
  由于ID_INDICATOR_TIME是一个ID而不是一个类,所以上述消息映射只能手动加入而不能使用ClassWizard。  
  注意:如果你的程序还需要增加OnTimer函数(使用ClassWizard),那么你应当先使用ClassWizard加入ON_WM_TIMER消息映射,然后再手动加入上述消息映射,如果次序相反,上述消息映射将会被ClassWizard删除掉。  
  编辑Mainfrm.cpp,加入下列函数:  
  void   CMainFrame::OnUpdateTime(CCmdUI   *pCmdUI)  
  {//状态条时间显示函数  
          CTime   t   =   CTime::GetCurrentTime();  
          char   szTime[6];  
          int   nHour   =   t.GetHour();  
          int   nMinute   =   t.GetMinute();  
          if   (nHour   >   12)   nHour   =   nHour   -   12;//如要按24小时制显示,请将此行注释掉  
          wsprintf(szTime,   "%i:%02i",   nHour,   nMinute);//分秒一般习惯用两位表示  
          //把时间写到Pane  
          m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex  
                                  (ID_INDICATOR_TIME),   LPCSTR(szTime));  
          pCmdUI->Enable();  
  }  
  应用程序在有空闲时间(idle   time)时调用这个函数。每当应用程序清空其消息队列时,它将发送一个WM_IDLEUPDATECMDUI消息(新的idle   time)。关于idle   time的更多帮助信息,请参看CWinApp::OnIdle()函数的帮助。  
  到目前为止,程序还存在一个问题:当用户不操作该应用程序时,应用程序接受不到消息,也就谈不上清空消息队列,所以就不会有idle   time,因此显示的时间就不会得到刷新。我们将在第五步中解决这个问题。  
  在CMainFrame类OnCreate()中添加下列语句:  
  m_nIDTimer   =   ::SetTimer(NULL,   0,   1000,   NULL);//发送消息,以便更新状态条时间  
  上述语句每秒钟发送一个消息到应用程序的消息队列,当应用程序清空其消息队列时,时间显示将被更新。在CMainFrame类析构函数中调用::KillTimer(NULL,   m_nIDTimer)  
  更多信息  
  当模式对话框弹出时(例如Help的About对话框),应用程序的消息队列由对话框处理。由于对话框的消息管理不包括idle   time处理,所以OnUpdateTime函数不会被调用。如果你要在应用中使用模式对话框,那么你的项目还要进行下面的改进(加入TimerProc函数以处理WM_TIMER消息):  
  编辑Mainfrm.h和Mainfrm.cpp。在CMainFrame类中加入下列函数的声明及定义:  
  Mainfrm.h  
          static   void   CALLBACK   TimerProc(HWND   hwnd,   UINT   uMsg,   UINT   uIDEvent,  
                                  DWORD   dwTime);  
  Mainfrm.cpp  
          void   CALLBACK   CMainFrame::TimerProc(HWND   hwnd,   UINT   uMsg,  
                                  UINT   uIDEvent,   DWORD   dwTime)  
          {  
                  CMainFrame   *pMainWnd   =   (CMainFrame   *)AfxGetApp()->m_pMainWnd;  
                  ASSERT(uIDEvent   ==   pMainWnd->m_nIDTimer);  
                  CCmdUI   cui;  
                  cui.m_nID   =   ID_INDICATOR_TIME;  
                  cui.m_nIndex   =   4;  
                  cui.m_pMenu   =   NULL;  
                  cui.m_pOther   =   &pMainWnd->m_wndStatusBar;  
                  pMainWnd->OnUpdateTime(&cui);//调用OnUpdateTime()函数,更新时间显示  
          }  
  修改CMainFrame类OnCreate()函数中SetTimer的调用格式:  
  m_nIDTimer   =   ::SetTimer(NULL,   0,   1000,   TimerProc);    
   
   
   
   
  宽度默认就可以了Top

8 楼ietj(萧枫)回复于 2002-03-13 14:30:18 得分 0

thanks   各位这么买力,这是我始料不及的,可不可以留个qq联系,分数马上就到Top

9 楼ietj(萧枫)回复于 2002-03-13 14:47:32 得分 0

请问kaitty那里的1代表什么Top

相关问题

  • 在状态栏添加时间显示?
  • 如何得到系统时间,并且在状态栏显示?
  • 怎么在状态栏中显示系统时间?
  • 状态栏的显示
  • 状态栏如何分几个小格显示“微帮助”、系统时间。
  • 如何获得线程的运行时间,并在状态栏显示出来?
  • 状态栏显示鼠标的坐标
  • 状态栏怎么样显示文本?
  • 状态栏怎么不显示出来?
  • 状态栏显示Icon的问题

关键词

  • 函数
  • 应用程序
  • 消息
  • 映射
  • cmainframe
  • onupdatetime
  • mainfrm
  • nidtimer
  • 调用
  • nhour

得分解答快速导航

  • 帖主:ietj
  • kaitty
  • Flysnow

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo