Adding a clock to the status bar

CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More.

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

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read