热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

上一节中鸡啄米讲了工具栏的创建、停靠与使用,本节来讲解状态栏的知识。状态栏简介状态栏相信大家在很多窗口中都能见到,它总是用来显示各种状态。状态栏实际上
上一节中鸡啄米讲了
工具栏的创建、停靠与使用,本节来讲解状态栏的知识。

       状态栏简介

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

       用MFC向导生成的单文档或多文档程序都会自动创建状态栏,大家可以运行下VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)中创建的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++代码
  1. if (!m_wndStatusBar.Create(this))   
  2. {   
  3.     TRACE0("Failed to create status bar\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,           // status line indicator   
  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设置窗格的文本。

       状态栏应用实例

       鸡啄米看到网上有很多人在问,怎样在状态栏添加一个时间窗格,用来显示系统时间,本节就给出这样一个实例。此实例依然是在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++代码
  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. 在Class View类视图中找到CMainFrame类,右键选择“Properties”,然后在显示出来的属性页中,点工具栏上的Messages按钮,即显示出消息列表,找到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. 运行程序,我们看到状态栏的最后一个窗格中能够实时显示系统时间,如下图:

VS2010状态栏的使用详解 

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








转自:http://www.jizhuomi.com/software/219.html

推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
author-avatar
久久影视001
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有