📄 工具条和状态条.htm
字号:
{<Br> TRACE0("Failed to create status bar\n");<Br> return -1; // fail to create<Br> }<Br> //设置pane<Br> m_wndStatusBar.SetPaneInfo(0, m_wndStatusBar.GetItemID(0),SBPS_STRETCH,<Br> NULL );//SBPS_STRETCH表示第一个Pane区的大小是可变的<Br> m_wndStatusBar.SetPaneInfo(1, ID_INDICATOR_CONTROLS, SBPS_NORMAL, 45);<Br> m_wndStatusBar.SetPaneInfo(2, ID_INDICATOR_MISC, SBPS_NORMAL, 195);<Br>......}<Br></Br>修改Mainfrm.h,用CEnhanceStatusBar取代CMainFrame中的CStatusBar:<Br></Br>//CStatusBar m_wndStatusBar;<Br>CEnhanceStatusBar m_wndStatusBar;<Br></Br>现在编译运行,看看按钮出现了吗?没有,为什么?啊!对了!要修改OnSize()函数。利用ClassWizard给CEnhanceStatusBar类加入OnSize()函数:<Br></Br>void CEnhanceStatusBar::OnSize(UINT nType, int cx, int cy)<Br>{<Br> CStatusBar::OnSize(nType, cx, cy);<Br> PositionControls();<Br> //调整你自己的控件的位置<Br> //PositionCustomControl();<Br> //调整你自己的控件的位置<Br>}<Br>再编译运行,按钮们出现了,但是他们还不会响应你的操作,下面我们将给这些按钮加入相应的函数。<Br></Br>给按钮加入消息映射,只能手工操作了,利用ClassWizard是不行的。在EnhanceStatusBar.h文件的<Br>//{{AFX_MSG(CEnhanceStatusBar)<Br>//}}AFX_MSG<Br>中间(也就是有afx_msg void OnSize(UINT nType,int cx,int cy);的地方)加入下列代码:<Br>afx_msg void OnLeftButton();<Br>afx_msg void OnRightButton();<Br>afx_msg void OnInfoButton();<Br>afx_msg void OnUpdateLeftButton(CCmdUI* pCmdUI);<Br>afx_msg void OnUpdateRightButton(CCmdUI* pCmdUI);<Br>afx_msg void OnUpdateInfoButton(CCmdUI* pCmdUI);<Br></Br>在EnhanceStatusBar.cpp文件的<Br>BEGIN_MESSAGE_MAP(CEnhanceStatusBar, CStatusBar)<Br> //{{AFX_MSG_MAP(CEnhanceStatusBar)<Br> //}}AFX_MSG_MAP<Br>END_MESSAGE_MAP()<Br>中间(也就是有ON_WM_SIZE()的地方)加入下列代码:<Br></Br>ON_BN_CLICKED(IDC_LEFTBUTTON, OnLeftButton)<Br>ON_BN_CLICKED(IDC_RIGHTBUTTON, OnRightButton)<Br>ON_BN_CLICKED(IDC_INFOBUTTON, OnInfoButton)<Br>ON_UPDATE_COMMAND_UI(IDC_LEFTBUTTON, OnUpdateLeftButton)<Br>ON_UPDATE_COMMAND_UI(IDC_RIGHTBUTTON, OnUpdateRightButton)<Br>ON_UPDATE_COMMAND_UI(IDC_INFOBUTTON, OnUpdateInfoButton)<Br></Br>在EnhanceStatusBar.cpp文件中加入上述函数的定义:<Br>void CEnhanceStatusBar::OnLeftButton()<Br>{<Br> if (CurrentMessagePosition)<Br> {<Br> Messages.GetPrev(CurrentMessagePosition);<Br> CString& msg = Messages.GetAt(CurrentMessagePosition);<Br> SetPaneText(0, msg);<Br> }<Br>}<Br></Br>void CEnhanceStatusBar::OnRightButton()<Br>{<Br> if (CurrentMessagePosition)<Br> {<Br> Messages.GetNext(CurrentMessagePosition);<Br> CString& msg = Messages.GetAt(CurrentMessagePosition);<Br> SetPaneText(0, msg);<Br> }<Br>}<Br></Br>void CEnhanceStatusBar::OnInfoButton()<Br>{<Br> if (CurrentMessagePosition)<Br> {<Br> CString& msg = Messages.GetAt(CurrentMessagePosition);<Br> MessageBox(msg,"This message is...", MB_OK);<Br> }<Br>}<Br></Br>void CEnhanceStatusBar::OnUpdateLeftButton(CCmdUI* pCmdUI)<Br>{<Br> if (CurrentMessagePosition && (CurrentMessagePosition !=<Br> Messages.GetHeadPosition()))<Br> pCmdUI->Enable(TRUE);<Br> else<Br> pCmdUI->Enable(FALSE);<Br>}<Br></Br>void CEnhanceStatusBar::OnUpdateRightButton(CCmdUI* pCmdUI)<Br>{<Br> if (CurrentMessagePosition && (CurrentMessagePosition !=<Br> Messages.GetTailPosition()))<Br> pCmdUI->Enable(TRUE);<Br> else<Br> pCmdUI->Enable(FALSE);<Br>}<Br></Br>void CEnhanceStatusBar::OnUpdateInfoButton(CCmdUI* pCmdUI)<Br>{<Br> if (CurrentMessagePosition)<Br> pCmdUI->Enable(TRUE);<Br> else<Br> pCmdUI->Enable(FALSE);<Br>}<Br></Br>为了能测试按钮的功能,本文中再加入一些其他的函数。AddMessage()函数会在CStringList Messages中插入一个元素(element),当你按动左移或右移按钮时,状态条将按照CStringList中的顺序显示其元素;当你按动Info按钮时,应用程序将在一个对话框中显示当前元素。ClearMessage()函数将清除所有元素。<Br>BOOL CEnhanceStatusBar::AddMessage(CString msg, int pos)<Br>{//将msg插入到pos之后的位置<Br> POSITION p;<Br> if (pos < Messages.GetCount())<Br> {<Br> POSITION pp = Messages.FindIndex(pos - 1);<Br> p = Messages.InsertAfter(pp, msg);<Br> }<Br> else<Br> p = Messages.AddTail(msg);<Br> CurrentMessagePosition = p;//设置当前讯息位置<Br> SetPaneText(0, msg);//在状态条上显示<Br> return TRUE;<Br>}<Br></Br>BOOL CEnhanceStatusBar::ClearMessages()<Br>{<Br> Messages.RemoveAll();//清除所有元素<Br> CurrentMessagePosition = 0;//当前讯息位置置为0<Br> return TRUE;<Br>}<Br></Br>在应用中加入相应的菜单,并用下列方式调用上述函数<Br></Br>void CMainFrame::OnMenuAddMessage()<Br>{<Br> static int counter = 0;<Br> counter ++;<Br> CString str;<Br> str.Format("Status bar message %d", counter);<Br> GetStatusBar().AddMessage(str, 3);<Br>}<Br></Br>void CMainFrame::OnMenuClearMessage()<Br>{<Br> GetStatusBar().ClearMessages();<Br>}<Br></Br>void CMainFrame::OnUpdateMenuClearMessage(CCmdUI* pCmdUI)<Br>{<Br> if (GetStatusBar().CurrentMessagePosition)<Br> pCmdUI->Enable(TRUE);<Br> else<Br> pCmdUI->Enable(FALSE);<Br>}<Br></Br>现在你的按钮应该可以让你在各条讯息之间滚动了。<Br></Br>测试进程条。加入函数,并且在应用中加入相应的菜单及函数:<Br>void CEnhanceStatusBar::SetProgress(BOOL show, int range)<Br>{<Br> if (!(StatusFlags & ENHANCEBAR_PROGRESS))<Br> return;<Br> if (!GetProgressControl().m_hWnd)<Br> return;<Br> if (!show)<Br> {<Br> GetProgressControl().ShowWindow(SW_HIDE);<Br> return;<Br> }<Br> if (range > 0)<Br> GetProgressControl().SetRange(0,range);<Br> GetProgressControl().ShowWindow(SW_SHOW);<Br> GetProgressControl().SetPos(1);<Br>}<Br></Br>void CMainFrame::OnMenuTestProgress()<Br>{<Br> CEnhanceStatusBar& statusBar=GetStatusBar();<Br> statusBar.SetProgress(TRUE, 100);<Br> int max = 3000;<Br> int i;<Br> for (i = 0; i < max; i++)<Br> statusBar.GetProgressControl().StepIt();<Br> statusBar.SetProgress(FALSE, NULL);<Br>}<Br></Br>备注<Br>如何通过菜单命令改变状态条的格式呢?在应用中加入相应的菜单和下面的函数:<Br>static UINT indicators1[] =<Br>{<Br> ID_SEPARATOR, // status line indicator<Br> ID_INDICATOR_CONTROLS,<Br> ID_INDICATOR_MISC,<Br>};<Br></Br>void CMainFrame::OnMenuStatus1()<Br>{//状态条一,带有消息区,左、右移按钮,Info按钮和进程条<Br> CEnhanceStatusBar& statusBar=GetStatusBar();<Br> if (!statusBar.Create(this, ENHANCEBAR_PROGRESS | ENHANCEBAR_INFO |<Br> ENHANCEBAR_BUTTON, 2, 1))<Br> {<Br> TRACE0("Failed to create status bar\n");<Br> }<Br> if (!statusBar.SetIndicators(indicators1, sizeof(indicators1)<Br> /sizeof(UINT)))<Br> {<Br> TRACE0("Failed to create status bar\n");<Br> }<Br> statusBar.SetPaneInfo(0, statusBar.GetItemID(0), SBPS_STRETCH, NULL);<Br> statusBar.SetPaneInfo(1, ID_INDICATOR_CONTROLS, SBPS_NORMAL, 45);<Br> statusBar.SetPaneInfo(2, ID_INDICATOR_MISC, SBPS_NORMAL, 195);<Br> statusBar.PositionControls();<Br>}<Br></Br>static UINT indicators2[] =<Br>{<Br> ID_SEPARATOR, // status line indicator<Br> ID_INDICATOR_CONTROLS,<Br>};<Br></Br>void CMainFrame::OnMenuStatus2()<Br>{//状态条二,带有消息区(含进程条),左、右移按钮<Br> CEnhanceStatusBar& statusBar=GetStatusBar();<Br> if (!statusBar.Create(this, ENHANCEBAR_PROGRESS |<Br> ENHANCEBAR_BUTTON, 0, 1))<Br> {<Br> TRACE0("Failed to create status bar\n");<Br> }<Br> if (!statusBar.SetIndicators(indicators2, sizeof(indicators2)<Br> /sizeof(UINT)))<Br> {<Br> TRACE0("Failed to create status bar\n");<Br> }<Br> statusBar.SetPaneInfo(0, statusBar.GetItemID(0), SBPS_STRETCH, NULL );<Br> statusBar.SetPaneInfo(1, ID_INDICATOR_CONTROLS, SBPS_NORMAL, 29);<Br> statusBar.PositionControls();<Br>}<Br></Br>static UINT indicators3[] =<Br>{<Br> ID_SEPARATOR // status line indicator<Br>};<Br></Br>void CMainFrame::OnMenuStatus3()<Br>{//状态条三,带有消息区(含进程条)<Br> CEnhanceStatusBar& statusBar=GetStatusBar();<Br></Br> if (!statusBar.Create(this, ENHANCEBAR_PROGRESS, 0, 0))<Br> {<Br> TRACE0("Failed to create status bar\n");<Br> }<Br> if (!statusBar.SetIndicators(indicators3, sizeof(indicators3)<Br> /sizeof(UINT)))<Br> {<Br> TRACE0("Failed to create status bar\n");<Br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -