CToolBarCtrl和CToolBar区别 2010-12-22 14:05

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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值