在MFC应用程序中,状态栏是一个重要的用户界面元素,它能够为用户提供关于应用程序当前状态的即时信息。本文将介绍如何在状态栏中添加自定义面板,并实时更新显示时间。
状态栏通常由多个矩形区域组成,这些区域被称作“窗格”。在许多应用程序中,状态栏的右侧窗格用于显示大写锁定、数字锁定等按键的状态。默认情况下,这些窗格周围有一个3D边框。最左侧的窗格(窗格0)有时被称为“消息窗格”,它具有BPS_NOBORDERS样式,因此没有边框。这个窗格通常用于显示当前选中的菜单项或工具栏按钮的说明。此外,默认情况下,“消息窗格”是“弹性”的:它会占用状态栏中未被其他指示窗格使用的区域,以确保其他窗格始终右对齐。
要在状态栏中添加一个自定义窗格以显示自己的信息,只需遵循以下六个步骤。以本例为例,将在状态栏的最右侧位置显示当前时间,并每60秒更新一次。
首先,在字符串表中添加一个新的条目,ID为ID_INDICATOR_TIME,标题为'%5s“。额外的空格是为了在窗格中提供更多的空间,以防止文本被截断。
其次,在MainFrm.cpp文件中将ID_INDICATOR_TIME作为最后一个条目添加到indicators[]数组中(这样它将作为状态栏上的最右侧项出现)。
在mainfrm.h中的消息映射中添加以下内容:
afx_msg void OnUpdateTimeIndicator(CCmdUI *pCmdUI);
在MainFrm.cpp中添加宏调用:
ON_UPDATE_COMMAND_UI(ID_INDICATOR_TIME, OnUpdateTimeIndicator)
在MainFrm.cpp中创建函数体:
void CMainFrame::OnUpdateTimeIndicator(CCmdUI *pCmdUI)
{
CString strStatus;
strStatus.Format(ID_INDICATOR_TIME, time);
m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_TIME), strStatus);
}
最后,每60秒更新一次时间变量:
#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)
{
// TODO: Add your message handler code here and/or call default
if (nIDEvent == TIME_STATUSBAR)
{
char tempchar[20];
_strtime(tempchar);
// get current time
strncpy(time, tempchar, 5);
// extract only hour and minute info
}
CFrameWnd::OnTimer(nIDEvent);
}
秘密在于,每当变量time发生变化时,显示会在下一个空闲循环中自动更改。这是由MFC自动完成的。这不是很好吗?