demo1 (新建一个窗格)
demo2 (窗格显示时间)
demo3 (窗格显示鼠标坐标)
demo4 (窗格显示进度条)
//摘抄自MSDN /* 状态栏(CStatusBar 类的一个窗口对象)包含几个“窗格”。每个窗格都是状态栏中可用来显示信息的矩形区域。 例如,很多应用程序在最右边的窗格显示CAPSLOCK、NUMLOCK和其他键的状态。 应用程序还经常在最左边的窗格(窗格0)显示信息文本,此窗格有时称为“消息窗格”。 例如,默认 MFC 状态栏使用消息窗格显示一个字符串,来解释当前选定的菜单项或工具栏按钮。 */ //新建窗格 /* To create a status bar, follow these steps: 1.Construct the CStatusBar object. 2.Call the Create (or CreateEx) function to create the status-bar window and attach it to the CStatusBar object. 3.Call SetIndicators to associate a string ID with each indicator. */ /* 1.定义窗格的命令 ID。 在“视图”菜单上单击“资源视图”。右击项目资源并单击“资源符号”。在“资源符号”对话框中,单击“新建”。 键入一个命令 ID 名称:例如,ID_INDICATOR_PAGE。为 ID 指定值,或接受“资源符号”对话框建议的值。 例如,对于 ID_INDICATOR_PAGE,接受默认值。关闭“资源符号”对话框。 2.定义窗格中要显示的默认字符串。 打开“资源视图”后,在为应用程序列出资源类型的窗口中双击“String Table”。 打开“字符串表”编辑器后,从“插入”菜单中选择“新建字符串”。 在“字符串属性”窗口中,选择窗格的命令 ID(例如:ID_INDICATOR_PAGE)并键入默认字符串值, 如“Page ”。关闭字符串编辑器。(需要一个默认字符串以避免编译器错误。) 3.在文件 MAINFRM.CPP 中定位 indicators 数组。 该数组按从左向右的顺序为状态栏的所有指示器列出了命令 ID。 在数组中的适当位置,输入窗格的命令 ID。 */ demo1 (新建一个窗格) static UINT BASED_CODE indicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, ID_INDICATOR_PAGE, };
demo2 (窗格显示时间) /* There are three ways to update the text in a status-bar pane: 1.Call CWnd::SetWindowText to update the text in pane 0 only. 2.Call CCmdUI::SetText in the status bar’s ON_UPDATE_COMMAND_UI handler. 3.Call SetPaneText to update the text for any pane. */ CStatusBar::SetPaneInfo void SetPaneInfo( int nIndex, UINT nID, UINT nStyle, int cxWidth ); CStatusBar::SetPaneText BOOL SetPaneText( int nIndex, LPCTSTR lpszNewText, BOOL bUpdate = TRUE ); 方法1(添加定时器的方式) //step1 static UINT indicators[] = { ID_SEPARATOR, // status line indicator IDS_TIMER, //创建资源ID,并在字符串资源中赋值 IDS_PROGRESS, ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; //step2 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { SetTimer(1,1000,NULL);//添加定时器 } //step3 void CMainFrame::OnTimer(UINT nIDEvent) { int index = m_wndStatusBar.CommandToIndex(IDS_TIMER);//通过资源ID获取资源编号 CTime t = CTime::GetCurrentTime();//获取当前系统时间 CString str = t.Format("%H:%M:%S"); CClientDC dc(this); CSize cs = dc.GetTextExtent(str);//获取字符串长度 m_wndStatusBar.SetPaneInfo(nindex,IDS_TIMER,SBPS_NORMAL,cs.cx);//根据字符串长度设置窗格长度 m_wndStatusBar.SetPaneText(1,str,TRUE); CFrameWnd::OnTimer(nIDEvent); } 方法2(ON_UPDATE_COMMAND_UI的方式) //step1 static UINT indicators[] = { ID_SEPARATOR, // status line indicator IDS_TIMER, //创建资源ID,并在字符串资源中赋值 IDS_PROGRESS, ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; //step2 class CMainFrame : public CFrameWnd { protected: // control bar embedded members CStatusBar m_wndStatusBar; protected: afx_msg void OnProgress();//类的声明中添加响应函数 DECLARE_MESSAGE_MAP() }; //step3 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_UPDATE_COMMAND_UI(IDS_TIMER, OnUpdatetime)//添加消息映射 END_MESSAGE_MAP() //step4 void CMainFrame::OnUpdatetime(CCmdUI* pCmdUI) { CTime t = CTime::GetCurrentTime(); CString str = t.Format("%H:%M:%S"); pCmdUI->SetText(str); }
demo3 (窗格显示鼠标坐标) //在View类中捕获并添加WM_MOUSEMOVE的响应函数 //在View类中声明框架类 void CStyleView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CString str; str.Format("x=%d,y=%d", point.x, point.y); // ((CMainFrame *)GetParent())->SetMessageText(str);//方法1 // ((CMainFrame *)GetParent())->GetMessageBar()->SetWindowText(str);//方法2 GetParent()->GetDescendantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(str);//方法3 CView::OnMouseMove(nFlags, point); }
demo4 (窗格显示进度条) //在框架类中添加CProgressCtrl类对象 //在框架类中捕获并添加WM_PAINT消息的响应函数 void CMainFrame::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here CRect rect; m_wndStatusBar.GetItemRect(2,&rect); if(!m_progress.m_hWnd) { m_progress.Create(WS_CHILD|WS_VISIBLE, rect, &m_wndStatusBar,123); } else { m_progress.MoveWindow(rect); } m_progress.SetPos(50); // Do not call CFrameWnd::OnPaint() for painting messages }