來源:http://blog.sina.com.cn/s/blog_4b3c1f950100b2pa.html標簽:狀態(tài)欄 CStatusBar6.3 狀態(tài)欄設計
狀態(tài)欄用于顯示應用程序當前的狀態(tài),、系統(tǒng)時間或其他上下文信息等。例如顯示菜單和工具欄的提示信息,,可以將狀態(tài)欄分成多個面板進而顯示不同的信息,。
6.3.1
狀態(tài)欄類CStatusBar
在MFC類庫中,提供了CStatusBar類用于設計狀態(tài)欄,,CStatusBar類的主要方法如下,。
(1)Create方法:該方法用于創(chuàng)建狀態(tài)欄窗口。語法如下:
BOOL Create( CWnd* pParentWnd, DWORD dwStyle = WS_CHILD |
WS_VISIBLE | CBRS_BOTTOM,
UINT nID = AFX_IDW_STATUS_BAR );
參數(shù)如下
pParentWnd:標識狀態(tài)欄父窗口,。
dwStyle:標識狀態(tài)欄風格,。可選值如下:
CBRS_TOP:狀態(tài)欄位于框架窗口的頂部,。
CBRS_BOTTOM:狀態(tài)欄位于框架窗口的底部,。
CBRS_NOALIGN:當父窗口重新調(diào)整尺寸時不重新定位狀態(tài)欄,。
nID:標識狀態(tài)欄ID。
(2)CreateEx方法:該方法與Create方法類似,,用于創(chuàng)建狀態(tài)欄窗口,,只是該方法支持擴展風格。語法如下:
BOOL CreateEx( CWnd* pParentWnd, DWORD dwCtrlStyle = 0 ,DWORD
dwStyle = WS_CHILD |
WS_VISIBLE | CBRS_BOTTOM,UINT nID = AFX_IDW_STATUS_BAR );
參數(shù)如下
pParentWnd:標識父窗口指針,。
dwCtrlStyle:標識狀態(tài)欄的擴展風格,。可選值如下,。
SBARS_SIZEGRIP:在狀態(tài)欄的右側有一個調(diào)整大小的狀態(tài)欄控件,,它是一個特別 的區(qū)域,可以單擊并拖動它來調(diào)整父窗口的大小,。
SBT_TOOLTIPS:狀態(tài)欄支持工具提示,。
dwStyle:標識窗口風格。
nID:標識狀態(tài)欄ID,。
(3)SetIndicators方法:該方法用于向狀態(tài)欄中添加面板,,并設置面板ID。語法如下:
BOOL SetIndicators( const UINT* lpIDArray, int nIDCount );
參數(shù)如下
lpIDArray:標識一個無符號整型數(shù)組,,該數(shù)組中包含了面板ID,。
nIDCount:用于標識數(shù)組元素數(shù)量。
(4)CommandToIndex方法:該方法用于根據(jù)面板ID返回面板索引,。語法如下:
int CommandToIndex( UINT nIDFind ) const;
參數(shù)如下
nIDFind:標識面板ID,。
返回值:返回值是面板ID對應的面板索引,如果面板ID沒有關聯(lián)的面板,,返回值為-1,。
(5)GetItemID方法:該方法與CommandToIndex方法是相對的,用于根據(jù)面板索引返回面板ID,。語法如下:
UINT GetItemID( int nIndex ) const;
參數(shù)如下
nIndex:標識面板ID,。
(6)GetItemRect方法:該方法用于獲取某個面板的顯示區(qū)域。語法如下:
void GetItemRect( int nIndex, LPRECT lpRect ) const;
參數(shù)如下
nIndex:標識面板ID,。
lpRect:用于接收面板的顯示區(qū)域,。
(7)GetPaneInfo方法:該方法用于獲取面板信息。語法如下:
void GetPaneInfo( int nIndex, UINT& nID,
UINT& nStyle, int& cxWidth )
const;
參數(shù)如下
nIndex:標識面板索引,。
nID:用于接收面板ID,。
nStyle:用于接收面板風格。
cxWidth:用于接收面板寬度,。
(8)GetPaneStyle方法:該方法用于獲取面板風格,。語法如下:
UINT GetPaneStyle( int nIndex ) const;
參數(shù)如下
nIndex:標識面板索引。
返回值:面板風格,。
(9)GetPaneText方法:該方法用于獲取面板文本,。語法如下:
CString GetPaneText( int nIndex ) const;
void GetPaneText( int nIndex, CString& rString )
const;
參數(shù)如下
nIndex:標識面板索引,。
rString:用于接收面板文本。
(10)GetStatusBarCtrl方法:該方法用于返回底層的通用狀態(tài)欄控件,。語法如下:
CStatusBarCtrl& GetStatusBarCtrl( ) const;
(11)SetPaneStyle方法:該方法用于設置面板[g2] 風格。語法如下:
void SetPaneStyle( int nIndex, UINT nStyle );
參數(shù)如下
nIndex:標識面板索引,。
nStyle:標識面板風格,。
(12)SetPaneText方法:該方法用于設置面板文本。語法如下:
BOOL SetPaneText( int nIndex, LPCTSTR lpszNewText, BOOL bUpdate
= TRUE );
參數(shù)如下
nIndex:標識面板ID,。
lpszNewText:標識面板文本,。
bUpdate:標識是否立即更新面板。
(13)SetPaneInfo方法:該方法用于設置面板基本信息,。語法如下:
void SetPaneInfo( int nIndex, UINT nID, UINT nStyle, int cxWidth
);
參數(shù)如下
nIndex:標識面板索引,。
nID:表示設置的面板ID。
nStyle:表示設置的面板風格,。
cxWidth:表示設置的面板寬度,。
6.3.2
狀態(tài)欄的創(chuàng)建
在應用程序窗口的最下方就是狀態(tài)欄,狀態(tài)欄可以顯示應用程序的狀態(tài)等信息,。本節(jié)來介紹一下如何創(chuàng)建狀態(tài)欄,。
(1)創(chuàng)建一個基于對話框的應用程序。
(2)在主窗口的頭文件中聲明一個CStatusBar類對象m_StatusBar,,代碼如下:
CStatusBar m_StatusBar;
(3)在主窗口的OnInitDialog函數(shù)中創(chuàng)建狀態(tài)欄,,代碼如下:
BOOL CStatusBarDlg::OnInitDialog()
{
……
UINT
array[3];
for(int
i=0;i<3;i++)
{
array[i] = 100+i;
}
m_StatusBar.Create(this); //創(chuàng)建狀態(tài)欄窗口
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);
//顯示狀態(tài)欄
return
TRUE;
}
程序運行結果如圖6.38所示,。
圖6.38 狀態(tài)欄的創(chuàng)建
6.3.3
在狀態(tài)欄中顯示滾動字幕
在應用程序中經(jīng)常會看到文本可以進行滾動的狀態(tài)欄,。下面就來看一下如何在狀態(tài)欄中顯示滾動字幕。
(1)創(chuàng)建一個基于對話框的應用程序,。
(2)在主窗口的頭文件中聲明一個CStatusBar類對象m_StatusBar,,代碼如下:
CStatusBar m_StatusBar;
(3)在主窗口的OnInitDialog函數(shù)中創(chuàng)建狀態(tài)欄,代碼如下:
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); //創(chuàng)建狀態(tài)欄窗口
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); //獲得狀態(tài)欄第3個面板的顯示字符
len =
sText.GetLength();
sright =
sText.Left(2);
sleft =
sText.Right(len-2);
sText =
sleft + sright;
m_StatusBar.SetPaneText(2,sText); //設置狀態(tài)欄第3個面板的顯示字符
CDialog::OnTimer(nIDEvent);
}
通過不斷改變狀態(tài)欄第3個面板的顯示字符,從而達到顯示滾動字幕的效果,,如圖6.39所示,。
圖6.39 在狀態(tài)欄中顯示滾動字幕
6.3.4
帶進度條的狀態(tài)欄
狀態(tài)欄多用于顯示程序執(zhí)行的狀態(tài)信息。但是,,如果程序正在執(zhí)行一個任務,,狀態(tài)欄將如何描述程序當前的執(zhí)行進度呢?最好的辦法是在狀態(tài)欄中放置一個進度條控件,,由進度條控件來顯示程序的執(zhí)行進度,。下面就來看一下如何在狀態(tài)欄中放置進度條控件,。
(1)創(chuàng)建一個基于對話框的應用程序。
(2)向對話框中添加一個進度條控件,,通過類向導為進度條控件添加變量m_Progress,。
(3)在主窗口的頭文件中聲明一個CStatusBar類對象m_StatusBar,代碼如下:
CStatusBar m_StatusBar;
(4)在主窗口的OnInitDialog函數(shù)中創(chuàng)建狀態(tài)欄,,代碼如下:
BOOL CStatusBarDlg::OnInitDialog()
{
……
UINT
array[4];
for(int
i=0;i<4;i++)
{
array[i] = 100+i;
}
m_StatusBar.Create(this); //創(chuàng)建狀態(tài)欄窗口
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,"當前狀態(tài):");
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
//顯示狀態(tài)欄
RECT
m_rect;
m_StatusBar.GetItemRect(3,&m_rect);
//獲取第4個面板的區(qū)域
m_Progress.SetParent(&m_StatusBar);
//設置進度條的父窗口為狀態(tài)欄
m_Progress.MoveWindow(&m_rect);
//設置進度條顯示的位置
m_Progress.ShowWindow(SW_SHOW);
//顯示進度條控件
m_Progress.SetRange(0,100);
//設置進度條范圍
m_Progress.SetPos(70);
//設置進度條當前位置
return
TRUE;
}
程序運行結果如圖6.40所示,。
圖6.40 帶進度條的狀態(tài)欄
6.3.5
狀態(tài)欄控制類CStatusBarCtrl
除了使用CStatusBar可以創(chuàng)建狀態(tài)欄以外,還可以使用CStatusBarCtrl類,。CStatusBarCtrl類提供了Windows通用狀態(tài)欄控件的功能,。它是一個水平的窗口,通常顯示在父窗口的底部,,可以分割為多個窗格,,在其中應用程序可以顯示不同類型的狀態(tài)信息。
CStatusBarCtrl類的主要方法如表6.2所示,。
表6.2
CStatusBarCtrl類主要方法表
方 法
|
描 述
|
Create
|
創(chuàng)建狀態(tài)欄并將它與一個CStatusBarCtrl類對象連接
|
SetText
|
設置狀態(tài)欄的給定窗格中的文本
|
GetText
|
獲取狀態(tài)欄的給定窗格中的文本
|
GetTextLength
|
獲取狀態(tài)欄的給定窗格中的文本字符數(shù)表示的長度
|
SetParts
|
設置狀態(tài)欄中分割的窗格數(shù),,及每個部分的右邊坐標
|
GetParts
|
獲取狀態(tài)欄中分割的窗格數(shù)
|
GetBorders
|
獲取狀態(tài)欄的水平或垂直邊界的對齊寬度
|
續(xù)表
方 法
|
描 述
|
SetMinHeight
|
設置狀態(tài)欄繪制區(qū)域的最小高度
|
SetSimple
|
指定狀態(tài)欄是顯示文本還是顯示由上一次調(diào)用SetParts所設置的窗格
|
GetRect
|
獲取狀態(tài)欄中的一個窗格的邊界矩形
|
IsSimple
|
檢查狀態(tài)欄是否處于簡單模式
|
GetTipText
|
獲取狀態(tài)欄中的一個窗格的提示文本
|
SetTipText
|
設置狀態(tài)欄中的一個窗格的提示文本
|
SetBkColor
|
設置狀態(tài)欄窗格的背景顏色
|
SetIcon
|
設置狀態(tài)欄窗格圖標
|
DrawItem
|
繪制狀態(tài)欄外觀
|
下面使用CStatusBarCtrl類創(chuàng)建一個狀態(tài)欄。
步驟如下:
(1)創(chuàng)建一個基于對話框的應用程序,。
(2)在主窗口的頭文件中聲明一個CStatusBarCtrl類對象m_StatusBar,,代碼如下:
CStatusBarCtrl m_StatusBar;
(3)在主窗口的OnInitDialog函數(shù)中創(chuàng)建狀態(tài)欄,代碼如下,。
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;
}
程序運行結果如圖6.41所示,。
圖6.41
使用CStatusBarCtrl類創(chuàng)建狀態(tài)欄
|