6.3 状态栏设计
状态栏用于显示应用程序当前的状态、系统时间或其他上下文信息等。例如显示菜单和工具栏的提示信息,可以将状态栏分成多个面板进而显示不同的信息。
6.3.1 状态栏类CStatusBar
在MFC类库中,提供了CStatusBar类用于设计状态栏,CStatusBar类的主要方法如下。
(1)Create方法:该方法用于创建状态栏窗口。语法如下:
BOOL Create( CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_BOTTOM,
UINT nID = AFX_IDW_STATUS_BAR );
参数如下
l pParentWnd:标识状态栏父窗口。
l dwStyle:标识状态栏风格。可选值如下:
² CBRS_TOP:状态栏位于框架窗口的顶部。
² CBRS_BOTTOM:状态栏位于框架窗口的底部。
² CBRS_NOALIGN:当父窗口重新调整尺寸时不重新定位状态栏。
l nID:标识状态栏ID。
(2)CreateEx方法:该方法与Create方法类似,用于创建状态栏窗口,只是该方法支持扩展风格。语法如下:
BOOL CreateEx( CWnd* pParentWnd, DWORD dwCtrlStyle = 0 ,DWORD dwStyle = WS_CHILD |
WS_VISIBLE | CBRS_BOTTOM,UINT nID = AFX_IDW_STATUS_BAR );
参数如下
l pParentWnd:标识父窗口指针。
l dwCtrlStyle:标识状态栏的扩展风格。可选值如下。
² SBARS_SIZEGRIP:在状态栏的右侧有一个调整大小的状态栏控件,它是一个特别的区域,可以单击并拖动它来调整父窗口的大小。
² SBT_TOOLTIPS:状态栏支持工具提示。
l dwStyle:标识窗口风格。
l nID:标识状态栏ID。
(3)SetIndicators方法:该方法用于向状态栏中添加面板,并设置面板ID。语法如下:
BOOL SetIndicators( const UINT* lpIDArray, int nIDCount );
参数如下
l lpIDArray:标识一个无符号整型数组,该数组中包含了面板ID。
l nIDCount:用于标识数组元素数量。
(4)CommandToIndex方法:该方法用于根据面板ID返回面板索引。语法如下:
int CommandToIndex( UINT nIDFind ) const;
参数如下
l nIDFind:标识面板ID。
返回值:返回值是面板ID对应的面板索引,如果面板ID没有关联的面板,返回值为-1。
(5)GetItemID方法:该方法与CommandToIndex方法是相对的,用于根据面板索引返回面板ID。语法如下:
UINT GetItemID( int nIndex ) const;
参数如下
l nIndex:标识面板ID。
(6)GetItemRect方法:该方法用于获取某个面板的显示区域。语法如下:
void GetItemRect( int nIndex, LPRECT lpRect ) const;
参数如下
l nIndex:标识面板ID。
l lpRect:用于接收面板的显示区域。
(7)GetPaneInfo方法:该方法用于获取面板信息。语法如下:
void GetPaneInfo( int nIndex, UINT& nID, UINT& nStyle, int& cxWidth ) const;
参数如下
l nIndex:标识面板索引。
l nID:用于接收面板ID。
l nStyle:用于接收面板风格。
l cxWidth:用于接收面板宽度。
(8)GetPaneStyle方法:该方法用于获取面板风格。语法如下:
UINT GetPaneStyle( int nIndex ) const;
参数如下
l nIndex:标识面板索引。
返回值:面板风格。
(9)GetPaneText方法:该方法用于获取面板文本。语法如下:
CString GetPaneText( int nIndex ) const;
void GetPaneText( int nIndex, CString& rString ) const;
参数如下
l nIndex:标识面板索引。
l rString:用于接收面板文本。
(10)GetStatusBarCtrl方法:该方法用于返回底层的通用状态栏控件。语法如下:
CStatusBarCtrl& GetStatusBarCtrl( ) const;
(11)SetPaneStyle方法:该方法用于设置面板[g2] 风格。语法如下:
void SetPaneStyle( int nIndex, UINT nStyle );
参数如下
l nIndex:标识面板索引。
l nStyle:标识面板风格。
(12)SetPaneText方法:该方法用于设置面板文本。语法如下:
BOOL SetPaneText( int nIndex, LPCTSTR lpszNewText, BOOL bUpdate = TRUE );
参数如下
l nIndex:标识面板ID。
l lpszNewText:标识面板文本。
l bUpdate:标识是否立即更新面板。
(13)SetPaneInfo方法:该方法用于设置面板基本信息。语法如下:
void SetPaneInfo( int nIndex, UINT nID, UINT nStyle, int cxWidth );
参数如下
l nIndex:标识面板索引。
l nID:表示设置的面板ID。
l nStyle:表示设置的面板风格。
l cxWidth:表示设置的面板宽度。
6.3.2 状态栏的创建
在应用程序窗口的最下方就是状态栏,状态栏可以显示应用程序的状态等信息。本节来介绍一下如何创建状态栏。
(1)创建一个基于对话框的应用程序。
(2)在主窗口的头文件中声明一个CStatusBar类对象m_StatusBar,代码如下:
CStatusBar m_StatusBar;
(3)在主窗口的OnInitDialog函数中创建状态栏,代码如下:
BOOL CStatusBarDlg::OnInitDialog()
{
……
UINT array[3];
for(int i=0;i<3;i++)
{
array[i] = 100+i;
}
m_StatusBar.Create(this); //创建状态栏窗口
m_StatusBar.SetIndicators(array,sizeof(array)/sizeof(UINT)); //添加面板
for(int n=0;n<3;n++)
{
m_StatusBar.SetPaneInfo(n,array[n],0,130); //设置面板宽度
}
//设置面板文本
m_StatusBar.SetPaneText(0,"当前用户");
m_StatusBar.SetPaneText(1,"mrkj");
m_StatusBar.SetPaneText(2,"逍逍");
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); //显示状态栏
return TRUE;
}
6.3.3 在状态栏中显示滚动字幕
在应用程序中经常会看到文本可以进行滚动的状态栏。下面就来看一下如何在状态栏中显示滚动字幕。
(1)创建一个基于对话框的应用程序。
(2)在主窗口的头文件中声明一个CStatusBar类对象m_StatusBar,代码如下:
CStatusBar m_StatusBar;
(3)在主窗口的OnInitDialog函数中创建状态栏,代码如下:
BOOL CStatusTextDlg::OnInitDialog()
{
……
// TODO: Add extra initialization here
UINT array[3];
for(int i=0;i<3;i++)
{
array[i] = 100+i;
}
m_StatusBar.Create(this); //创建状态栏窗口
m_StatusBar.SetIndicators(array,sizeof(array)/sizeof(UINT)); //添加面板
for(int n=0;n<3;n++)
{
m_StatusBar.SetPaneInfo(n,array[n],0,130); //设置面板宽度
}
//设置面板文本
m_StatusBar.SetPaneText(0,"当前用户");
m_StatusBar.SetPaneText(1,"mrkj");
m_StatusBar.SetPaneText(2," 空念远");
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
SetTimer(1,300,NULL); //设置定时器
return TRUE; // return TRUE unless you set the focus to a control
}
(4)处理WM_TIMER消息,设置定时器是为了定时设置要滚动显示的字符串,代码如下:
void CStatusTextDlg::OnTimer(UINT nIDEvent)
{
CString sText,sleft,sright;
int len;
sText = m_StatusBar.GetPaneText(2); //获得状态栏第3个面板的显示字符
len = sText.GetLength();
sright = sText.Left(2);
sleft = sText.Right(len-2);
sText = sleft + sright;
m_StatusBar.SetPaneText(2,sText); //设置状态栏第3个面板的显示字符
CDialog::OnTimer(nIDEvent);
}
通过不断改变状态栏第3个面板的显示字符,从而达到显示滚动字幕的效果
6.3.4 带进度条的状态栏
状态栏多用于显示程序执行的状态信息。但是,如果程序正在执行一个任务,状态栏将如何描述程序当前的执行进度呢?最好的办法是在状态栏中放置一个进度条控件,由进度条控件来显示程序的执行进度。下面就来看一下如何在状态栏中放置进度条控件。
(1)创建一个基于对话框的应用程序。
(2)向对话框中添加一个进度条控件,通过类向导为进度条控件添加变量m_Progress。
(3)在主窗口的头文件中声明一个CStatusBar类对象m_StatusBar,代码如下:
CStatusBar m_StatusBar;
(4)在主窗口的OnInitDialog函数中创建状态栏,代码如下:
BOOL CStatusBarDlg::OnInitDialog()
{
……
UINT array[4];
for(int i=0;i<4;i++)
{
array[i] = 100+i;
}
m_StatusBar.Create(this); //创建状态栏窗口
m_StatusBar.SetIndicators(array,sizeof(array)/sizeof(UINT)); //添加面板
for(int n=0;n<4;n++)
{
m_StatusBar.SetPaneInfo(n,array[n],0,90); //设置面板宽度
}
//设置面板文本
m_StatusBar.SetPaneText(0,"当前用户:");
m_StatusBar.SetPaneText(1,"mrkj");
m_StatusBar.SetPaneText(2,"当前状态:");
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); //显示状态栏
RECT m_rect;
m_StatusBar.GetItemRect(3,&m_rect); //获取第4个面板的区域
m_Progress.SetParent(&m_StatusBar); //设置进度条的父窗口为状态栏
m_Progress.MoveWindow(&m_rect); //设置进度条显示的位置
m_Progress.ShowWindow(SW_SHOW); //显示进度条控件
m_Progress.SetRange(0,100); //设置进度条范围
m_Progress.SetPos(70); //设置进度条当前位置
return TRUE;
}
6.3.5 状态栏控制类CStatusBarCtrl
除了使用CStatusBar可以创建状态栏以外,还可以使用CStatusBarCtrl类。CStatusBarCtrl类提供了Windows通用状态栏控件的功能。它是一个水平的窗口,通常显示在父窗口的底部,可以分割为多个窗格,在其中应用程序可以显示不同类型的状态信息。
CStatusBarCtrl类的主要方法如表6.2所示。
表6.2 CStatusBarCtrl类主要方法表
方 法 | 描 述 |
Create | 创建状态栏并将它与一个CStatusBarCtrl类对象连接 |
SetText | 设置状态栏的给定窗格中的文本 |
GetText | 获取状态栏的给定窗格中的文本 |
GetTextLength | 获取状态栏的给定窗格中的文本字符数表示的长度 |
SetParts | 设置状态栏中分割的窗格数,及每个部分的右边坐标 |
GetParts | 获取状态栏中分割的窗格数 |
GetBorders | 获取状态栏的水平或垂直边界的对齐宽度 |
续表
方 法 | 描 述 |
SetMinHeight | 设置状态栏绘制区域的最小高度 |
SetSimple | 指定状态栏是显示文本还是显示由上一次调用SetParts所设置的窗格 |
GetRect | 获取状态栏中的一个窗格的边界矩形 |
IsSimple | 检查状态栏是否处于简单模式 |
GetTipText | 获取状态栏中的一个窗格的提示文本 |
SetTipText | 设置状态栏中的一个窗格的提示文本 |
SetBkColor | 设置状态栏窗格的背景颜色 |
SetIcon | 设置状态栏窗格图标 |
DrawItem | 绘制状态栏外观 |
下面使用CStatusBarCtrl类创建一个状态栏。
步骤如下:
(1)创建一个基于对话框的应用程序。
(2)在主窗口的头文件中声明一个CStatusBarCtrl类对象m_StatusBar,代码如下:
CStatusBarCtrl m_StatusBar;
(3)在主窗口的OnInitDialog函数中创建状态栏,代码如下。
BOOL CStatusCtrlDlg::OnInitDialog()
{
……
m_StatusBar.Create(WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),this,1100);
int width[]={200,340,480};
m_StatusBar.SetParts(3, &width[0]);
m_StatusBar.SetText("公司",0,0);
m_StatusBar.SetText("当前用户:mrkj",0,1);
CTime t;
t = CTime::GetCurrentTime();
CString strdate;
strdate.Format("当前日期:%s",t.Format("%y-%m-%d"));
m_StatusBar.SetText(strdate,0,2);
return TRUE;
}