狀態條是一個包含信息的控制條,通常用於信息和狀態提示,這裡信息是有關菜單命令或工具命令的提示字符串以及其它指示/幫助信息,而狀態是用來指示SCROLL LOCK 和NUM LOCK等一些鍵的狀態。狀態條通常框架窗口的底部。狀態條的信息行能顯示有關的程序狀態或鼠標指向的工具按鈕或菜單項的信息。狀態條既不能接受用戶輸入,也不產生命令信息。
實際上,從編程人員的角度出發(至少是那些使用AppWizard創建應用程序的編程人員),狀態條是如此普通,它們並不像工具條那樣允許用戶編輯的資源。在創建程序框架時,用戶只需告訴AppWizard為應用程序包含一個狀態條,可以說,此時,用戶的工作就完成了。但是,我們如果巧妙使用工具條,我們會發現它可以幫我們實現很多功能。
按以下做法我們實現在狀態條上顯示滾動字符串,鼠標的坐標,動態時鐘。
第一步:
運行AppWizard生成一個工程mystatus,接受所有的默認設置,除了下面兩步:在step 1中選Single Document ;step 4 中去掉Docking Bar 前的對鉤,然後點擊 Advanced 按鈕,選擇Window Styles 中的 Maximized選項。點擊Finish按鈕,此時我們生成了一個工程。運行我們可以發現程序默認生成的狀態條,接下來我們要對這個狀態條進行修改。
第二步:
在這一步我們將實現把狀態條移到菜單的下邊。在MainFrm.cpp中我們可以看到狀態條的定義部分
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar ");
return -1; // fail to create
}
我們所要做的是將上面的定義改為
if(!m_wndStatusBar.Create(this, WS_CHILD|WS_VISIBLE|CBRS_TOP,AFX_IDW_STATUS_BAR) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar ");
return -1; // fail to create
}
運行程序,這時我們可以發現,狀態條已經移到了上邊。
第三步:
在這一步,我們實現在狀態條實現滾動文字。
< 1 > 在MainFrm.cpp中,我們可以發現如下的定義
static UINT indicators[] =
{
ID_SEPARATOR,
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
我們將其改為
static UINT indicators[] =
{
ID_SEPARATOR,
ID_STATUS1,
ID_STATUS2,
ID_STATUS3,
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
<2>在菜單VIEW中選擇Resource Symbols , 在對話框中選擇NEW, 在NAME中輸入ID_STATUS1,VALUE中取默認值,同樣方法定義ID_STATUS2,ID_STATUS3。
<3>定義字符串資源,在ResouceVIEw中選擇String Table,在其中為ID_STATUS1定義字符串資源為"me",同樣方法定義ID_STATUS2,ID_STATUS3。
<4>在MainFrm.h中定義如下變量:
public:
CString str,str1;
<5>在MainFrm.cpp中修改OnCreate函數如下:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if(!m_wndStatusBar.Create (this,WS_CHILD|WS_VISIBLE|CBRS_TOP,AFX_IDW_STATUS_BAR) || !m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar ");
return -1; // fail to create
}
m_wndStatusBar.SetPaneInfo(1,ID_STATUS1,SBPS_POPOUT,320);
m_wndStatusBar.SetPaneInfo(2,ID_STATUS2,SBPS_POPOUT,100);
m_wndStatusBar.SetPaneInfo(3,ID_STATUS3,SBPS_POPOUT,100);
str1=str="你好,歡迎使用本程序,祝你合家幸福,事業有成!";
SetTimer(1,200,NULL);
SetTimer(2,10,NULL);
return 0;
}
<6>在類CmainFrame中重載函數OnTimer(),並添加如下代碼:
void CMainFrame::OnTimer(UINT nIDEvent)
{
file:// TODO: Add your message handler code here and/or call default
if(nIDEvent==1){
if(str.IsEmpty()) str=str1;
str=str.Right(str.GetLength()-2);
m_wndStatusBar.SetPaneText(1,str);
}
if(nIDEvent==2){
SYSTEMTIME t;
::GetLocalTime(&t);
CString str2;
str2.Format("%d:%d:%d:%d",t.wHour,t.wMinute,t.wSecond,t.wMilliseconds);
m_wndStatusBar.SetPaneText(3,str2);
}
CFrameWnd::OnTimer(nIDEvent);
}
<7>將MainFrm.h中,定義m_wndStatusBar之前的 protected: 改為public:
<8>通過類向導在類CmystatusVIEw中重載WM_MOUSEMOVE,並在實現函數中添加如下代碼:
void CMystatusVIEw::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CString str3;
str3.Format("X:%d,Y:%d",point.x,point.y);
((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar.SetPaneText(2,str3);
CVIEw::OnMouseMove(nFlags, point);
}
好了,到這裡我們所有的功能就都實現了,快編譯運行一下吧!怎麼樣?還滿意嗎?