自定义状态栏信息显示

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自动完成的。这不是很好吗?

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485