CStatusBar是带有一行文本输出窗格的控制项。
基本介绍
- 中文名指示器
- 外文名CStatusBar
- 实质带有一行文本输出窗格的控制项
- 作用作讯息行和状态指示器
- 类别定义
简介
一个CStatusBar 对象是一个带有一行文本输出窗格的控制项,或者称为“指示器”。
这些输出窗格常被用作讯息行和状态指示器。例如简单解释所选选单命令的
选单帮助讯息行,作为显示SCROLL LOCK,NUMLOCK 以及其它键状态的指
示器。
在MFC4.0 之后新增加的成员函式CStatusBar:: GetStatusBarCtrl,允许你利用
Windows 通用控制项对状态条的定製和其它功能的支持。CStatusBar 成员函式提
供了Windows 通用控制项的大多数功能;,当你调用GetStatusBarCtrl 时,
你可以赋予你的状态条更多的Windows95 状态条的特性。当你调用
GetStatusBarCtrl 时, 它将返回一个对CStatusBarCtrl 对象的引用。参见
CStatusBarCtrl 可以获得有关使用Windows 通用控制项设计工具条的更多信息。
有关通用控制项的更多的一般信息,请参见“Windows 95 SDK 程式设计师参考”中
的“通用控制项”。
框架将指示器的信息保存在一个数组中,且最左边的的指示器位于0 位置上。
当创建一个工具条时,可以使用一个字元串ID 数组,框架把这一组ID 与对应
的指示器关联起来。此后,你就可以使用字元串ID 或索引值访问一个指示器。
预设的,第一个指示器是“可伸缩的”该指示器占据了其它指示器窗格未用
到的状态条长度,其它窗格是右对齐的。
可以按下列步骤创建一个状态条
1. 构造CStatusBar 对象。
2. 调用Create(或CreateEx)函式来创建状态条视窗并将它连线到CStatusBar
对象。
3. 调用SetIndicators 函式将字元串ID 与每一个指示器联繫起来。
有三种办法可以更新状态条视窗中的文本
1. 调用CWnd::SetWindowText 只更新窗格0 中的文本。
2. 在状态条的ON_UPDATE_COMMAND_UI 处理程式中调用
CCmdUI::SetText 函式。
成员函式
构造函式
CStatusBar() 构造一个CStatusBar对象。
Create() 创建状态条,并将它与CStatusBar对象连线,且设定初始字型和条高度。
CreateEx() 创建一个具有嵌入CStatusBarCtrl对象附加风格的CStatusBar对象。
SetIndicators() 设定指示器ID。
属性函式
CommandToIndex() 获取给定指示器ID的索引。
GetItemID() 获取给定索引的指示器ID IDGetItemRect 获取给定索引值得显示範围。
GetItemRect() 获取给定索引值的显示矩形。
GetPaneInfo() 获取一个给定索引的指示器ID,风格和宽度。
SetPaneInfo() 设定一个给定索引的指示器ID,风格和宽度。
GetPaneStyle() 获取一个给定索引的指示器风格。
SetPaneStyle() 设定一个给定索引的指示器风格。
GetPaneText() 获取一个给定索引的指示器文本。
SetPaneText() 设定一个给定索引的指示器文本。
重载函式
DrawItem() 当一个主绘製的状态栏控制项的外观改变时,调用此函式。
状态栏示例
1. 新建一个多文档的MFC应用程式;
2. 状态栏的定义在CMainFrame类中定义,如下
protected: // control bar embedded members
CStatusBar m_wndStatusBar;
3. 在CMainFrame类的OnCreate函数里,生成状态栏
//////////////////////////////////////////////////////////////////////////
//状态栏
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
注意,上述有一个变数indicators;它是一个静态的一个数组,它的定义是有MFC自动生成的;具体代码如下
//////////////////////////////////////////////////////////////////////////
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
说明indicators存放的是字元串的ID 号;不同的ID号,对应不同的字元串;
如果想要在右下角的状态栏上继续添加状态栏,可以先新建一个字元串的资源,设定相应的ID号;将该ID号添加到indicators数组中即可;
比如我们新建两个字元串资源,属性为 IDS_PROCESS 进度 IDS_TIME 时间 ;然后将它们的ID号加入到indicators数组中;运行即可;
4. 在状态栏实时显示系统时间
很明显,实时显示需要动态每隔一秒钟显示一下时间,需要用到WM_TIME讯息回响;对CMainFrame类增加WM_TIME讯息回响;
4.1 在类的OnCreate函式中,设定定时器周期; SetTimer(1,1000,NULL);
4.2 在OnTimer函式中添加如下代码
CTime time=CTime::GetCurrentTime();//获得当前时间
CString str="时间"+time.Format("%H-%M-%S");//将时间转化为字元串
int index=0;//定义一个整型变数,用于存储字元串资源的ID,初始化为0
index=m_wndStatusBar.CommandToIndex(IDS_TIME);
//一下是为了获得字元串STR的空间大小,是str字元串完整的呈现出来;
CClientDC dc(this);
CSize zs=dc.GetTextExtent(str);//获得str字元串画出来时的大小
m_wndStatusBar.SetPaneInfo(index,IDS_TIME,SBPS_NORMAL,zs.cx);//设定索引为index的状态栏的宽度
m_wndStatusBar.SetPaneText(index,str,TRUE);//将含有时间的str字元串显示在状态栏上;