Adding a clock to the status bar

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;

More by Author

Must Read