Here is how to add the current time to your status bar…
Step 1:
Derive a CMyStatusBar class from CStatusBar as follows:
//MyStatusBar.h: //============== class CMyStatusBar : public CStatusBar { DECLARE_DYNCREATE(CMyStatusBar) public: CMyStatusBar(); ~CMyStatusBar(); private: CString m_strClockFormat; public: void SetClockFormat(LPCTSTR strClockFormat); // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CMyStatusBar) //}}AFX_VIRTUAL // Generated message map functions //{{AFX_MSG(CMyStatusBar) afx_msg void OnDestroy(); afx_msg void OnUpdateIndicatorTime(CCmdUI* pCmdUI); afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct ); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////// //MyStatusBar.cpp: //============== #include "stdafx.h" #include "MyStatusBar.h" #include "Resource.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif IMPLEMENT_DYNCREATE(CMyStatusBar, CStatusBar) BEGIN_MESSAGE_MAP(CMyStatusBar, CStatusBar) ON_WM_CREATE() ON_WM_DESTROY() ON_UPDATE_COMMAND_UI(ID_INDICATOR_TIME, OnUpdateIndicatorTime) END_MESSAGE_MAP() CMyStatusBar::CMyStatusBar() : CStatusBar() , m_strClockFormat("%H:%M:%S") { } CMyStatusBar::~CMyStatusBar() { } void CMyStatusBar::SetClockFormat(LPCTSTR strClockFormat) { m_strClockFormat = strClockFormat; } int CMyStatusBar::OnCreate(LPCREATESTRUCT lpCreateStruct) { // make sure time gets updated every second, even when idle CStatusBar::OnCreate(lpCreateStruct); SetTimer(ID_INDICATOR_TIME,1000,NULL); return 0; } void CMyStatusBar::OnUpdateIndicatorTime(CCmdUI* pCmdUI) { pCmdUI->Enable(true); pCmdUI->SetText(CTime::GetCurrentTime().Format(m_strClockFormat)); } void CMyStatusBar::OnDestroy() { KillTimer(ID_INDICATOR_TIME); ProgressDestroy(); CStatusBar::OnDestroy(); }
Step 2:
Create a new indicator pane by first adding a new menu called
“ID_INDICATOR”, add a single dropdown called “Indicator”, add a single
item to the menu called “Time” – This should create a menu item with id
ID_INDICATOR_TIME. Give it a prompt string of, say, “HH:MM:SS” which
reserves an approriate amount of space for the pane. NOTE: If you change
time format by calling SetClockFormat you will need to ensure that your
ID_INDICATOR_TIME pane is big enough.
Step 3:
Add a new indicator pane called ID_INDICATOR_TIME to your list of indicator
in your mainframe
eg. this is my indicator list…
static const UINT indicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, ID_INDICATOR_TIME, // <-- new indicator pane };
Step 4:
Replace all existing uses of CStatusBar in your app with CMyStatusBar – in
particular, the member variable in your mainframe m_wndStatusBar;