VS2010-MFC(狀態欄的使用詳解)


 

轉自:http://www.jizhuomi.com/software/219.html

 

上一節講了工具欄的創建、停靠與使用,本節來講解狀態欄的知識。

 

       狀態欄簡介

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

       用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++代碼
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的數組:

C++代碼
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函數中調用:

C++代碼:
 
  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++代碼
static UINT indicators[] = { ID_SEPARATOR, // status line indicator  ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, ID_INDICATOR_TIME };  
 

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

C++代碼
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),並修改此函數實現如下:

C++代碼
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. 運行程序,我們看到狀態欄的最后一個窗格中能夠實時顯示系統時間,如下圖:


 

 

        狀態欄的內容就講這些,其實還是比較簡單的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM