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字元串顯示在狀態欄上;