VS2019/MFC编程入门:状态栏的使用详解:

转帖|使用教程|编辑:鲍佳佳|2021-05-18 10:13:37.200|阅读 125 次

概述:上一节中讲了工具栏的创建、停靠与使用,本节来讲解状态栏的知识。状态栏相信大家在很多窗口中都能见到,它总是用来显示各种状态。状态栏实际上也是一个窗口,一般分为几个窗格,每个窗格分别用来显示不同的信息和状态等,如菜单项和工具栏按钮的提示信息。

# 31款JAVA开发必备控件和工具 # 企业数字化建设合规无风险[专题]

相关链接:

上一节中讲了工具栏的创建、停靠与使用,本节来讲解状态栏的知识。开始前我们先了解一下mfc界面类库Xtreme Toolkit Pro

Xtreme Toolkit Pro:是屡获殊荣的VC界面库,是MFC开发中最全面界面控件套包,它提供了Windows开发所需要的11种主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Report Control、Shortcut Bar、Syntax Edit、Skin Framework 和Task Panel。

点击下载Xtreme Toolkit Pro最新试用版

状态栏简介

状态栏相信大家在很多窗口中都能见到,它总是用来显示各种状态。状态栏实际上也是一个窗口,一般分为几个窗格,每个窗格分别用来显示不同的信息和状态等,如菜单项和工具栏按钮的提示信息。

用MFC向导生成的单文档或多文档程序都会自动创建状态栏,大家可以运行下(VS2010/MFC编程入门:2010菜单资源详解)中创建的Example34程序,在结果界面中可以看到窗口底部有个状态栏,该状态栏被分为了几个窗格,分别用来显示菜单项和工具栏按钮的提示信息及Caps Lock、Num Lock、Scroll Lock键的状态。

当然,我们可以自定义状态栏,加入新的提示信息或指示器。

CStatusBar类

MFC为状态栏提供了CStatusBar类,封装了状态栏的属性和操作。

下面是CStatusBar类几个主要的成员函数:

virtual BOOL Create(CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_BOTTOM, UINT nID = AFX_IDW_STATUS_BAR);

创建一个状态栏。参数pParentWnd为状态栏父窗口的指针,参数dwStyle为状态栏的风格,除了标准的Windows风格外,它还支持:

CBRS_TOP:位于框架窗口的顶部。

CBRS_BOTTOM:位于框架窗口的底部。

CBRS_NOALIGN:父窗口大小改变时状态栏不会被重新定位。

参数nID指定状态栏的ID。

BOOL SetIndicators(const UINT* lpIDArray, int nIDCount);

为每个指示器设置显示文本,具体来说,就是用lpIDArray数组中的对应元素为每个指示器设置一个ID,然后加载每个ID代表的字符串,设置为这些指示器的显示文本。参数lpIDArray为指向一个ID数组的指针,参数nIDCount为lpIDArray数组的元素个数。

UINT GetItemID(int nIndex) const;

获取由nIndex指定的指示器的ID。参数nIndex为要获取ID的指示器索引。

CString GetPaneText(int nIndex) const;

获取状态栏窗格中显示的文本。参数nIndex为要获取文本的窗格的索引。返回值为包含窗格文本的CString对象。

BOOL SetPaneText(int nIndex, LPCTSTR lpszNewText, BOOL bUpdate = TRUE);

设置状态栏窗格的显示文本。参数nIndex为要设置文本的窗格的索引,参数lpszNewText为指向新的窗格文本的指针,参数bUpdate表示是否设置后立即更新显示。如果设置成功则返回TRUE,否则返回FALSE。

状态栏的创建

在Example34程序中,我们在CMainFrame类中看到,创建状态栏时使用的是CMFCStatusBar类对象。CMFCStatusBar类是自VS2008以来提供的状态栏类,用法与CStatusBar类相似,甚至很多成员函数也类似,但它的功能更加丰富。关于CMFCStatusBar类的成员函数可以查阅MSDN了解。

下面就以Example34程序的CMFCStatusBar类对象为例,来讲讲状态栏的创建步骤:

1. 构造一个CMFCStatusBar类的对象。

在MainFrm.h文件中,为CMainFrame类定义了一个成员对象:CMFCStatusBar     m_wndStatusBar;。

2. 调用CMFCStatusBar::Create函数来创建状态栏窗口。

在CMainFrame::OnCreate函数的实现中,我们可以找到CMFCStatusBar::Create函数的调用:


C++代码


if (!m_wndStatusBar.Create(this))
{
TRACE0("Failed to create status bar\n");
return -1;      // fail to create
}



3. 调用CMFCStatusBar::SetIndicators函数为状态栏划分窗格,并为每个指示器设置显示文本。

CMFCStatusBar::SetIndicators函数需要一个ID数组的参数,在MainFrm.cpp中,如下定义了一个窗格ID的数组:


C++代码


static UINT indicators[] =
{
ID_SEPARATOR,           // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};



indicators数组定义了状态栏窗格的划分信息。第一个元素一般为ID_SEPARATOR,对应的窗格用来显示命令提示信息,上面数组中的后三项为指示器文本的字符串ID,可以根据这些ID在String Table字符串资源中找到相应的字符串,查找方法是,在Resource View资源视图中,打开String Table字符串资源,可以看到有ID、Value和Caption三列,在ID列中找到需要的ID,对应的Caption列文本就是要查找的字符串。ID_INDICATOR_CAPS、ID_INDICATOR_NUM和ID_INDICATOR_SCRL对应的字符串分别是CAP、NUM、SCRL,对应的三个窗格分别为Caps Lock指示器、Num Lock指示器和Scroll Lock指示器。

定义了指示器数组就可以使用CMFCStatusBar::SetIndicators函数为状态栏划分窗格了,依然是在CMainFrame::OnCreate函数中调用:


C++代码


m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));



这样状态栏就创建完成了,之后我们可以通过CMFCStatusBar::SetPaneText设置窗格的文本。

状态栏应用实例

看到网上有很多人在问,怎样在状态栏添加一个时间窗格,用来显示系统时间,本节就给出这样一个实例。此实例依然是在Example34的基础上进行修改的。步骤如下:

1. 在Resource View资源视图中打开String Table字符串资源,然后在最后一行的下一个空白行中,或者任意处点右键选择“New String”,添加一个新的字符串资源,ID为ID_INDICATOR_TIME,Value设为一个不与任何其他字符串资源重复的整数值,Caption设为"00:00:00",这是为了给时间的显示预留空间,因为状态栏会根据字符串的长度为相应的窗格确定缺省宽度。

2. 在indicators数组的第一个元素ID_INDICATOR_SCRL后插入ID_INDICATOR_TIME。


C++代码


static UINT indicators[] =
{
ID_SEPARATOR,           // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
ID_INDICATOR_TIME
};



3. 要实时显示系统时间,就需要使用一个定时器,每秒钟更新一次时间显示。在CMainFrame::OnCreate函数中开启定时器,代码如下:


C++代码


int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
return -1;
......略
// 启动定时器,定时器ID为1,定时时间为1000ms,即1s
SetTimer(1, 1000, NULL);
return 0;
}



4. 在Class View类视图中找到CMainFrame类,右键选择“Properties”,然后在显示出来的属性页中,点工具栏上的Messages按钮,即显示出消息列表,找到WM_TIMER消息,添加其消息处理函数void CMainFrame::OnTimer(UINT_PTR nIDEvent),并修改此函数实现如下:


C++代码


void CMainFrame::OnTimer(UINT_PTR nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CString strTime;
// 获取系统当前时间,并保存到curTime
CTime curTime = CTime::GetCurrentTime();
// 格式化curTime,将字符串保存到strTime
strTime = curTime.Format(_T("%H:%M:%S"));
// 在状态栏的时间窗格中显示系统时间字符串
m_wndStatusBar.SetPaneText(4, strTime);
CFrameWndEx::OnTimer(nIDEvent);
}



5. 运行程序,我们看到状态栏的最后一个窗格中能够实时显示系统时间,如下图:

VS2010状态栏的使用详解

状态栏的内容就讲这些,其实还是比较简单的。欢迎大家常来此学习。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至hey@evget.com

文章转载自:鸡啄米

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
在线咨询
联系我们
TOP
在线客服系统
live chat