VS2013/MFC编程入门之三十五(状态栏的使用详解)

38 篇文章 5 订阅

上一节中讲了工具栏的创建、停靠与使用,本节来讲解状态栏的知识。

       状态栏简介

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

       用MFC向导生成的单文档或多文档程序都会自动创建状态栏,大家可以运行下VS2013/MFC编程入门之三十二(菜单:VS2010菜单资源详解)中创建的Example32程序,在结果界面中可以看到窗口底部有个状态栏,该状态栏被分为了几个窗格,分别用来显示菜单项和工具栏按钮的提示信息及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。

       状态栏的创建

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

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

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

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

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

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

C++代码
  1. if (!m_wndStatusBar.Create(this))   
  2. {   
  3.     TRACE0("未能创建状态栏\n");   
  4.     return -1;      // fail to create   
  5. }  

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

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

C++代码
  1. static UINT indicators[] =   
  2. {   
  3.     ID_SEPARATOR,           // 状态行指示器  
  4.     ID_INDICATOR_CAPS,   
  5.     ID_INDICATOR_NUM,   
  6.     ID_INDICATOR_SCRL,   
  7. };  

       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++代码
  1. m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));  

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

       状态栏应用实例

       接下来我们在Example32的基础上,在状态栏添加一个时间窗格,用来显示系统时间。步骤如下:

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

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

C++代码
  1. static UINT indicators[] =   
  2. {   
  3.     ID_SEPARATOR,           // status line indicator   
  4.     ID_INDICATOR_CAPS,   
  5.     ID_INDICATOR_NUM,   
  6.     ID_INDICATOR_SCRL,   
  7.     ID_INDICATOR_TIME   
  8. };  

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

C++代码
  1. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)   
  2. {   
  3.     if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)   
  4.         return -1;   
  5.   
  6.     ......略   
  7.   
  8.     // 启动定时器,定时器ID为1,定时时间为1000ms,即1s   
  9.     SetTimer(1, 1000, NULL);   
  10.   
  11.     return 0;   
  12. }  

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

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

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

 

        状态栏的内容就讲这些,其实还是比较简单的。欢迎大家留言进行学习交流,谢谢大家。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VS2010之MFC入门到精通教程的pdf,共306页 ,10大章节,55小节。完整有图版 第一部分:VS2010/MFC 开发环境 VS2010/MFC 编程入门之前言 VS2010/MFC 编程入门之一(VS2010 与MSDN 安装过程图解) 第二部分:VS2010/MFC 应用程序框架 VS2010/MFC 编程入门之二(利用MFC 向导生成单文档应用程序框架) VS2010/MFC 编程入门之三(VS2010 应用程序工程文件的组成结构) VS2010/MFC 编程入门之四(MFC 应用程序框架分析) VS2010/MFC 编程入门之五(MFC 消息映射机制概述) 第三部分:对话框 VS2010/MFC 编程入门之六(对话框:创建对话框模板和修改对话框属性) VS2010/MFC 编程入门之七(对话框:为对话框添加控件) VS2010/MFC 编程入门之八(对话框:创建对话框类和添加控件变量) VS2010/MFC 编程入门之九(对话框:为控件添加消息处理函数) VS2010/MFC 编程入门之十(对话框:设置对话框控件的Tab 顺序) VS2010/MFC 编程入门之十一(对话框:模态对话框及其弹出过程) VS2010/MFC 编程入门之十二(对话框:非模态对话框的创建及显示) VS2010/MFC 编程入门之十三(对话框:属性页对话框及相关类的介绍) VS2010/MFC 编程入门之十四(对话框:向导对话框的创建及显示) VS2010/MFC 编程入门之十五(对话框:一般属性页对话框的创建及显示) VS2010/MFC 编程入门之十六(对话框:消息对话框) VS2010/MFC 编程入门之十七(对话框:文件对话框) VS2010/MFC 编程入门之十八(对话框:字体对话框) VS2010/MFC 编程入门之十九(对话框:颜色对话框) 第四部分:常用控件 VS2010/MFC 编程入门之二十(常用控件:静态文本框) VS2010/MFC 编程入门之二十一(常用控件:编辑框Edit Control) VS2010/MFC 编程入门之二十二(常用控件:按钮控件Button、Radio Button 和Check Box) VS2010/MFC 编程入门之二十三(常用控件:按钮控件的编程实例) VS2010/MFC 编程入门之二十四(常用控件:列表框控件ListBox) VS2010/MFC 编程入门之二十五(常用控件:组合框控件Combo Box) VS2010/MFC 编程入门之二十六(常用控件:滚动条控件Scroll Bar) VS2010/MFC 编程入门之二十七(常用控件:图片控件Picture Control) VS2010/MFC 编程入门之二十八(常用控件:列表视图控件List Control 上) VS2010/MFC 编程入门之二十九(常用控件:列表视图控件List Control 下) VS2010/MFC 编程入门之三十(常用控件:树形控件Tree Control 上) VS2010/MFC 编程入门之三十一(常用控件:树形控件Tree Control 下) VS2010/MFC 编程入门之三十二(常用控件:标签控件Tab Control 上) VS2010/MFC 编程入门之三十三(常用控件:标签控件Tab Control 下) 第五部分:菜单、工具栏与状态栏 VS2010/MFC 编程入门之三十四(菜单:VS2010 菜单资源详解VS2010/MFC 编程入门三十五(菜单:菜单及CMenu 类的使用VS2010/MFC 编程入门之三十六(工具栏:工具栏资源及CToolBar 类) VS2010/MFC 编程入门之三十七(工具栏:工具栏的创建、停靠与使用VS2010/MFC 编程入门之三十八(状态栏使用详解) 第六部分:文档、视图和框架 VS2010/MFC 编程入门之三十九(文档、视图和框架:概述) VS2010/MFC 编程入门之四十(文档、视图和框架:各对象之间的关系) VS2010/MFC 编程入门之四十一(文档、视图和框架:分割窗口) 第七部分:MFC 常用类 VS2010/MFC 编程入门之四十二(MFC 常用类:CString 类) VS2010/MFC 编程入门之四十三(MFC 常用类:CTime 类和CTimeSpan 类) VS2010/MFC 编程入门之四十四(MFC 常用类:定时器Timer) VS2010/MFC 编程入门之四十五(MFC 常用类:CFile 文件操作类) VS2010/MFC 编程入门之四十六(MFC 常用类:MFC 异常处理) 第八部分:字体和文本输出 VS2010/MFC 编程入门之四十七(字体和文本输出:CFont 字体类) VS2010/MFC 编程入门之四十八(字体和文本输出:文本输出) 第九部分:图形图像 VS2010/MFC 编程入门之四十九(图形图像:CDC 类及其屏幕绘图函数) VS2010/MFC 编程入门之五十(图形图像:GDI 对象之画笔CPen) VS2010/MFC 编程入门之五十一(图形图像:GDI 对象之画刷CBrush) 第十部分:Ribbon 界面开发 VS2010/MFC 编程入门之五十二(Ribbon 界面开发:创建Ribbon 样式的应用程序框架) VS2010/MFC 编程入门之五十三(Ribbon 界面开发:为Ribbon Bar 添加控件) VS2010/MFC 编程入门之五十四(Ribbon 界面开发:使用更多控件并为控件添加消息处理函数)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值