狀態列簡介
狀態列相信大家在很多視窗中都能見到,它總是用來顯示各種狀態。狀態列實際上也是乙個視窗,一般分為幾個窗格,每個窗格分別用來顯示不同的資訊和狀態等,如選單項和工具欄按鈕的提示資訊。
用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
))
3. 呼叫cmfcstatusbar::setindicators函式為狀態列劃分窗格,並為每個指示器設定顯示文字。
cmfcstatusbar::setindicators函式需要乙個id陣列的引數,在mainfrm.cpp中,如下定義了乙個窗格id的陣列:
c++**
static
uint
indicators =
;
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 =
;
3. 要實時顯示系統時間,就需要使用乙個定時器,每秒鐘更新一次時間顯示。在cmainframe::oncreate函式中開啟定時器,**如下:
c++**
intcmainframe::oncreate(lpcreatestruct lpcreatestruct)
4. 在class view類檢視中找到cmainframe類,右鍵選擇「properties」,然後在顯示出來的屬性頁中,點工具欄上的messages按鈕,即顯示出訊息列表,找到wm_timer訊息,新增其訊息處理函式void cmainframe::ontimer(uint_ptr nidevent),並修改此函式實現如下:
c++**
void
cmainframe::ontimer(
uint_ptr
nidevent)
5. 執行程式,我們看到狀態列的最後乙個窗格中能夠實時顯示系統時間,如下圖:
使用狀態列
因為各種原因需要使用狀態列,調整狀態列背景顏色 文字顏色時,獲取到乙個工具類 public class statusbarutil else if build.version.sdk int build.version codes.lollipop if isxiaomi else if ismei...
安卓狀態列問題詳解大全(沉浸式狀態列)
1.解決頂部問題 2安卓透明狀態列和底部操作欄 在setcontentview 前面加上以下 解決底部重疊的問題 具體顏色自行修改 private void setstaus 3沉浸式狀態列 rl bar title這個布局是空的linnearlayout 放到headview的上面 protect...
Android透明狀態列 沉浸式狀態列
注意 android版本 4.4此方法有效 第一步 在activity的布局檔案中,根布局中加入以下第5 7行 第二步 新建類kitkatutils.class package cn.powerthink.djt.utils import android.annotation.suppresslin...