複製鏈接
請複製以下鏈接發送給好友

CStatusBar

鎖定
CStatusBar是帶有一行文本輸出窗格的控件。
中文名
指示器
外文名
CStatusBar
實    質
帶有一行文本輸出窗格的控件
作    用
作消息行和狀態指示器
類    別
定義

CStatusBar簡介

繼承圖表 繼承圖表 [1]
一個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構造函數

CStatusBar() 構造一個CStatusBar對象。
Create() 創建狀態條,並將它與CStatusBar對象連接,且設置初始字體和條高度。
CreateEx() 創建一個具有嵌入CStatusBarCtrl對象附加風格的CStatusBar對象。
SetIndicators() 設置指示器ID。

CStatusBar屬性函數

CommandToIndex() 獲取給定指示器ID的索引。
GetItemID() 獲取給定索引的指示器ID IDGetItemRect 獲取給定索引值得顯示範圍。
GetItemRect() 獲取給定索引值的顯示矩形。
GetPaneInfo() 獲取一個給定索引的指示器ID,風格和寬度。
SetPaneInfo() 設置一個給定索引的指示器ID,風格和寬度。
GetPaneStyle() 獲取一個給定索引的指示器風格。
SetPaneStyle() 設置一個給定索引的指示器風格。
GetPaneText() 獲取一個給定索引的指示器文本。
SetPaneText() 設置一個給定索引的指示器文本。

CStatusBar重載函數

DrawItem() 當一個主繪製的狀態欄控件的外觀改變時,調用此函數。

CStatusBar狀態欄示例

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字符串顯示在狀態欄上;
參考資料