轉自:http://www.jizhuomi.com/software/219.htmlhtml
上一節講了工具欄的建立、停靠與使用,本節來說解狀態欄的知識。編程
狀態欄簡介數組
狀態欄相信你們在不少窗口中都能見到,它老是用來顯示各類狀態。狀態欄實際上也是一個窗口,通常分爲幾個窗格,每一個窗格分別用來顯示不一樣的信息和狀態等,如菜單項和工具欄按鈕的提示信息。框架
用MFC嚮導生成的單文檔或多文檔程序都會自動建立狀態欄,你們能夠運行下VS2010/MFC編程入門之三十四(菜單:VS2010菜單資源詳解)中建立的Example34程序,在結果界面中能夠看到窗口底部有個狀態欄,該狀態欄被分爲了幾個窗格,分別用來顯示菜單項和工具欄按鈕的提示信息及Caps Lock、Num Lock、Scroll Lock鍵的狀態。函數
固然,咱們能夠自定義狀態欄,加入新的提示信息或指示器。工具
CStatusBar類this
MFC爲狀態欄提供了CStatusBar類,封裝了狀態欄的屬性和操做。spa
下面是CStatusBar類幾個主要的成員函數:指針
virtual BOOL Create(CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_BOTTOM, UINT nID = AFX_IDW_STATUS_BAR);code
建立一個狀態欄。參數pParentWnd爲狀態欄父窗口的指針,參數dwStyle爲狀態欄的風格,除了標準的Windows風格外,它還支持:
CBRS_TOP:位於框架窗口的頂部。
CBRS_BOTTOM:位於框架窗口的底部。
CBRS_NOALIGN:父窗口大小改變時狀態欄不會被從新定位。
參數nID指定狀態欄的ID。
BOOL SetIndicators(const UINT* lpIDArray, int nIDCount);
爲每一個指示器設置顯示文本,具體來講,就是用lpIDArray數組中的對應元素爲每一個指示器設置一個ID,而後加載每一個ID表明的字符串,設置爲這些指示器的顯示文本。參數lpIDArray爲指向一個ID數組的指針,參數nIDCount爲lpIDArray數組的元素個數。
UINT GetItemID(int nIndex) const;
獲取由nIndex指定的指示器的ID。參數nIndex爲要獲取ID的指示器索引。
CString GetPaneText(int nIndex) const;
獲取狀態欄窗格中顯示的文本。參數nIndex爲要獲取文本的窗格的索引。返回值爲包含窗格文本的CString對象。
BOOL SetPaneText(int nIndex, LPCTSTR lpszNewText, BOOL bUpdate = TRUE);
設置狀態欄窗格的顯示文本。參數nIndex爲要設置文本的窗格的索引,參數lpszNewText爲指向新的窗格文本的指針,參數bUpdate表示是否設置後當即更新顯示。若是設置成功則返回TRUE,不然返回FALSE。
狀態欄的建立
在Example34程序中,咱們在CMainFrame類中看到,建立狀態欄時使用的是CMFCStatusBar類對象。CMFCStatusBar類是自VS2008以來提供的狀態欄類,用法與CStatusBar類類似,甚至不少成員函數也相似,但它的功能更加豐富。關於CMFCStatusBar類的成員函數能夠查閱MSDN瞭解。
下面以Example34程序的CMFCStatusBar類對象爲例,來說講狀態欄的建立步驟:
1. 構造一個CMFCStatusBar類的對象。
在MainFrm.h文件中,爲CMainFrame類定義了一個成員對象:CMFCStatusBar m_wndStatusBar;。
2. 調用CMFCStatusBar::Create函數來建立狀態欄窗口。
在CMainFrame::OnCreate函數的實現中,咱們能夠找到CMFCStatusBar::Create函數的調用:
if (!m_wndStatusBar.Create(this)) { TRACE0("Failed to create status bar\n"); return -1; // fail to create }
3. 調用CMFCStatusBar::SetIndicators函數爲狀態欄劃分窗格,併爲每一個指示器設置顯示文本。
CMFCStatusBar::SetIndicators函數須要一個ID數組的參數,在MainFrm.cpp中,以下定義了一個窗格ID的數組:
static UINT indicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, };
indicators數組定義了狀態欄窗格的劃分信息。第一個元素通常爲ID_SEPARATOR,對應的窗格用來顯示命令提示信息,上面數組中的後三項爲指示器文本的字符串ID,能夠根據這些ID在String Table字符串資源中找到相應的字符串,查找方法是,在Resource View資源視圖中,打開String Table字符串資源,能夠看到有ID、Value和Caption三列,在ID列中找到須要的ID,對應的Caption列文本就是要查找的字符串。ID_INDICATOR_CAPS、ID_INDICATOR_NUM和ID_INDICATOR_SCRL對應的字符串分別是CAP、NUM、SCRL,對應的三個窗格分別爲Caps Lock指示器、Num Lock指示器和Scroll Lock指示器。
定義了指示器數組就可使用CMFCStatusBar::SetIndicators函數爲狀態欄劃分窗格了,依然是在CMainFrame::OnCreate函數中調用:
這樣狀態欄就建立完成了,以後咱們能夠經過CMFCStatusBar::SetPaneText設置窗格的文本。
狀態欄應用實例
雞啄米看到網上有不少人在問,怎樣在狀態欄添加一個時間窗格,用來顯示系統時間,本節就給出這樣一個實例。此實例依然是在Example34的基礎上進行修改的。步驟以下:
1. 在Resource View資源視圖中打開String Table字符串資源,而後在最後一行的下一個空白行中,或者任意處點右鍵選擇「New String」,添加一個新的字符串資源,ID爲ID_INDICATOR_TIME,Value設爲一個不與任何其餘字符串資源重複的整數值,Caption設爲"00:00:00",這是爲了給時間的顯示預留空間,由於狀態欄會根據字符串的長度爲相應的窗格肯定缺省寬度。
2. 在indicators數組的第一個元素ID_INDICATOR_SCRL後插入ID_INDICATOR_TIME。
static UINT indicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, ID_INDICATOR_TIME };
3. 要實時顯示系統時間,就須要使用一個定時器,每秒鐘更新一次時間顯示。在CMainFrame::OnCreate函數中開啓定時器,代碼以下:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWndEx::OnCreate(lpCreateStruct) == -1) return -1; ......略 // 啓動定時器,定時器ID爲1,定時時間爲1000ms,即1s SetTimer(1, 1000, NULL); return 0; }
4. 在Class View類視圖中找到CMainFrame類,右鍵選擇「Properties」,而後在顯示出來的屬性頁中,點工具欄上的Messages按鈕,即顯示出消息列表,找到WM_TIMER消息,添加其消息處理函數void CMainFrame::OnTimer(UINT_PTR nIDEvent),並修改此函數實現以下:
void CMainFrame::OnTimer(UINT_PTR nIDEvent) { // TODO: Add your message handler code here and/or call default CString strTime; // 獲取系統當前時間,並保存到curTime CTime curTime = CTime::GetCurrentTime(); // 格式化curTime,將字符串保存到strTime strTime = curTime.Format(_T("%H:%M:%S")); // 在狀態欄的時間窗格中顯示系統時間字符串 m_wndStatusBar.SetPaneText(4, strTime); CFrameWndEx::OnTimer(nIDEvent); }
5. 運行程序,咱們看到狀態欄的最後一個窗格中可以實時顯示系統時間,以下圖:
狀態欄的內容就講這些,其實仍是比較簡單的。