在MFC程序中如果使用默認(rèn)的狀態(tài)欄的話,其第一欄在空閑時(shí)顯示的是“就緒”,如果用戶點(diǎn)擊菜單,還會(huì)用于顯示菜單欄的提示文本,如“建立新文檔”等。有時(shí)候我們不希望程序在狀態(tài)欄中顯示這些東西,那該怎么辦呢?
在MFC中,是用主框架類(lèi)中的CStatusBar對(duì)象m_wndStatusBar來(lái)管理狀態(tài)欄的。CStatusBar中有一個(gè)SetPaneText的函數(shù)可用于設(shè)置狀態(tài)欄中的文字。我們?cè)贑MainFrame類(lèi)中的OnCreate函數(shù)中添加
m_wndStatusBar.SetPaneText(0, "Hello");
則程序啟動(dòng)后,狀態(tài)欄上顯示的文字為“Hello”。但是當(dāng)我們點(diǎn)擊菜單后,會(huì)發(fā)現(xiàn)這段文字會(huì)消失,被替換成菜單的提示文本;若菜單操作結(jié)束,則又顯示成“就緒”了。那該如何禁止MFC自動(dòng)修改狀態(tài)欄文本呢?
我們?cè)倏纯粗骺蚣茴?lèi)的源程序。當(dāng)中有這么一段
static UINT indicators[] =
{
ID_SEPARATOR,
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
而在OnCreate中有這么一段
m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)))
這一句的作用是設(shè)置狀態(tài)欄各部分的ID,默認(rèn)的ID由indicators數(shù)組指定。由于MFC中把狀態(tài)欄的第一欄設(shè)置為ID_SEPARATOR
了,這是一個(gè)MFC默認(rèn)的ID,所以它有一系列默認(rèn)的操作,如顯示“就緒”二字。我們想禁止MFC自動(dòng)操作狀態(tài)欄就必須修改indicators數(shù)組。
我們打開(kāi)Resource View,修改String Table,找到那堆ID_INDICATOR開(kāi)頭的,在后面新加一個(gè)ID_INDICATOR_1。然后修改CMainFrame中indicators的聲明
static UINT indicators[] =
{
ID_INDICATOR_1,
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
然后編譯運(yùn)行程序。我們會(huì)發(fā)現(xiàn),MFC不會(huì)再自動(dòng)修改狀態(tài)欄的文本了,可是前面添加的一句
m_wndStatusBar.SetPaneText(0, "Hello");
也不起作用了。這是為什么呢?
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/_core_status_bars.3a_.updating_the_text_of_a_status.2d.bar_pane.asp
MSDN上有一篇介紹如果修改狀態(tài)欄文本的文章。當(dāng)中有一句
Note?? The SetText approach is recommended. It is possible to
perform this task at a slightly lower level by calling the CStatusBar
member function SetPaneText. Even so, you still need an update handler.
Without such a handler for the pane, MFC automatically disables the
pane, erasing its content.
意思大概是如果我們不為狀態(tài)欄添加UPDATE的處理函數(shù),MFC會(huì)自動(dòng)禁止?fàn)顟B(tài)欄的該欄(pane)。按照MSDN的說(shuō)法,我們需要增加UPDATE的處理函數(shù)。在MainFrm.h中添加
afx_msg void OnUpdate1(CCmdUI *pCmdUI);
在MainFrm.cpp中添加
ON_UPDATE_COMMAND_UI(ID_INDICATOR_1, OnUpdate1)
void CMainFrame::OnUpdate1(CCmdUI *pCmdUI)
{
?pCmdUI->Enable();
}
這樣我們就可以往狀態(tài)欄的第一欄寫(xiě)文字,而避開(kāi)MFC對(duì)其的自動(dòng)修改了。