Introduction
I just had a look at the MSDN articles on CStatusBar
, and to my surprise, I found it so easy to use.
First of all, a status bar contains several 'panes'. Each pane is a rectangular area of the status bar that you can use to display information. As you know, many applications display the status of the CAPS, NUM LOCK, and other keys in the rightmost panes. These panes, by default, have a 3-D border around them. The leftmost pane (pane 0), sometimes called the 'message pane', has the BPS_NOBORDERS
style, and therefore doesn’t have any border surrounding it. This pane is usually used to display a string
explaining the currently selected menu item or toolbar button. Furthermore, by default, the 'message pane' is 'elastic': it takes up the area of the status-bar not used by the other indicator panes, so that the other panes are always right-aligned.
To add a customized pane to display your own message on the status bar, it only takes the following 6 steps. For this example, we are going to display the current time at the rightmost location of the status bar. It will be updated every 60 seconds.
First of all, add a new entry to your string
table with an ID of ID_INDICATOR_TIME
and a caption of '%5s “
. The extra spaces are to give you a little more room in the pane so the text will not be clipped.
Second, append ID_INDICATOR_TIME
to the indicators[]
array in the MainFrm.cpp file as the last entry (so that it will appear as the rightmost item on status bar).
Third, in the message map in mainfrm.h, add the following:
afx_msg void OnUpdateTimeIndicator(CcmdUI *pCmdUI);
Fourth, in MainFrm.cpp, add the macro call:
ON_UPDATE_COMMAND_UI ( ID_INDICATOR_TIME,OnUpdateTimeIndicator)
Fifth, in MainFrm.cpp, create the function body:
void CMainFrame::OnUpdateTimeIndicator(CCmdUI *pCmdUI)
{
CString strStatus;
strStatus.Format(ID_INDICATOR_TIME, time);
m_wndStatusBar.SetPaneText(
m_wndStatusBar.CommandToIndex(ID_INDICATOR_TIME),
strStatus );
}
Last of all, update the variable time every 60 seconds:
#define TIME_STATUSBAR 1
class CMainFrame : public CFrameWnd
{
……
private:
char time[7];
…..
}
void CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
……
SetTimer(TIME_STATUSBAR, 60000, NULL);
Memset(time, ‘\0’, 7);
……
}
void CMainFrame::OnTimer(UINT nIDEvent)
{
if ( nIDEvent == TIME_STATUSBAR )
{
char tempchar[20];
_strtime(tempchar);
strncpy(time, tempchar, 5);
}
CFrameWnd::OnTimer(nIDEvent);
}
The secret here is, whenever variable time changes, the display changes during the next idle loop. This is done automatically by MFC. Isn’t it nice?
If you wish, you can download the sample project, which does the same as described above.
License
This article has no explicit license attached to it, but may contain usage terms in the article text or the download files themselves. If in doubt, please contact the author via the discussion board below.
A list of licenses authors might use can be found here.