上一節中雞啄米講了工具欄的創建、??颗c使用,本節來講解狀態欄的知識。

       狀態欄簡介

       狀態欄相信大家在很多窗口中都能見到,它總是用來顯示各種狀態。狀態欄實際上也是一個窗口,一般分為幾個窗格,每個窗格分別用來顯示不同的信息和狀態等,如菜單項和工具欄按鈕的提示信息。

       用MFC向導生成的單文檔或多文檔程序都會自動創建狀態欄,大家可以運行下VS2010/MFC編程入門之三十四(菜單:VS2010菜單資源詳解)中創建的Example34程序,在結果界面中可以看到窗口底部有個狀態欄,該狀態欄被分為了幾個窗格,分別用來顯示菜單項和工具欄按鈕的提示信息及Caps Lock、Num Lock、Scroll Lock鍵的狀態。

       當然,我們可以自定義狀態欄,加入新的提示信息或指示器。

       CStatusBar類

       MFC為狀態欄提供了CStatusBar類,封裝了狀態欄的屬性和操作。

       下面是CStatusBar類幾個主要的成員函數:

       virtual BOOL Create(CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_BOTTOM, UINT nID = AFX_IDW_STATUS_BAR);

       創建一個狀態欄。參數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函數的調用:

C++代碼
  1. if (!m_wndStatusBar.Create(this))   
  2. {   
  3.     TRACE0("Failed to create status bar\n");   
  4.     return -1;      // fail to create   
  5. }  

       3. 調用CMFCStatusBar::SetIndicators函數為狀態欄劃分窗格,并為每個指示器設置顯示文本。

       CMFCStatusBar::SetIndicators函數需要一個ID數組的參數,在MainFrm.cpp中,如下定義了一個窗格ID的數組:

C++代碼
  1. static UINT indicators[] =   
  2. {   
  3.     ID_SEPARATOR,           // status line indicator   
  4.     ID_INDICATOR_CAPS,   
  5.     ID_INDICATOR_NUM,   
  6.     ID_INDICATOR_SCRL,   
  7. };  

       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函數中調用:

C++代碼
  1. m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));  

       這樣狀態欄就創建完成了,之后我們可以通過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。

C++代碼
  1. static UINT indicators[] =   
  2. {   
  3.     ID_SEPARATOR,           // status line indicator   
  4.     ID_INDICATOR_CAPS,   
  5.     ID_INDICATOR_NUM,   
  6.     ID_INDICATOR_SCRL,   
  7.     ID_INDICATOR_TIME   
  8. };  

       3. 要實時顯示系統時間,就需要使用一個定時器,每秒鐘更新一次時間顯示。在CMainFrame::OnCreate函數中開啟定時器,代碼如下:

C++代碼
  1. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)   
  2. {   
  3.     if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)   
  4.         return -1;   
  5.   
  6.     ......略   
  7.   
  8.     // 啟動定時器,定時器ID為1,定時時間為1000ms,即1s   
  9.     SetTimer(1, 1000, NULL);   
  10.   
  11.     return 0;   
  12. }  

        4. 在Class View類視圖中找到CMainFrame類,右鍵選擇“Properties”,然后在顯示出來的屬性頁中,點工具欄上的Messages按鈕,即顯示出消息列表,找到WM_TIMER消息,添加其消息處理函數void CMainFrame::OnTimer(UINT_PTR nIDEvent),并修改此函數實現如下:

C++代碼
  1. void CMainFrame::OnTimer(UINT_PTR nIDEvent)   
  2. {   
  3.     // TODO: Add your message handler code here and/or call default   
  4.     CString strTime;   
  5.     // 獲取系統當前時間,并保存到curTime   
  6.     CTime curTime = CTime::GetCurrentTime();   
  7.   
  8.     // 格式化curTime,將字符串保存到strTime   
  9.     strTime = curTime.Format(_T("%H:%M:%S"));   
  10.     // 在狀態欄的時間窗格中顯示系統時間字符串   
  11.     m_wndStatusBar.SetPaneText(4, strTime);   
  12.   
  13.     CFrameWndEx::OnTimer(nIDEvent);   
  14. }  

       5. 運行程序,我們看到狀態欄的最后一個窗格中能夠實時顯示系統時間,如下圖:

VS2010狀態欄的使用詳解 

        狀態欄的內容就講這些,其實還是比較簡單的。雞啄米歡迎大家常來此學習。

除非特別注明,雞啄米文章均為原創
轉載請標明本文地址:http://www.9385095.live/software/219.html
2012年8月11日
作者:雞啄米 分類:軟件開發 瀏覽: 評論:16