1.4 状态栏应用实例
状态栏位于主界面的底部,通常用于显示系统时间、程序运行时当前的状态信息等。在MFC中,提供了CStatusBar类用于创建和管理状态栏。本节将通过几个实例介绍状态栏的设计。
实例012 动画效果的状态栏
这是一个可以提高基础技能的实例
实例位置:光盘\mingrisoft\01\012
实例说明
在许多媒体软件中,状态栏中会播放一个动画,使界面更加美观。本实例就实现了一个动画效果的状态栏,效果如图1.16所示。
图1.16 动画效果的状态栏
技术要点
使状态栏播放一个动画很容易,只要将CAnimateCtrl控件放置在状态栏中就可以了。因为CAnimateCtrl控件可以播放无声的AVI动画。
实现过程
(1)新建一个基于对话框的应用程序。
(2)在对话框中放置CAnimateCtrl控件,并通过类向导将其命名为m_Animate。
(3)在对话框类中定义一个CStatusBar变量m_StatusBar。
(4)在对话框的OnInitDialog方法中创建状态栏,并将CAnimateCtrl控件显示在状态栏中。代码如下:
m_StatusBar.Create(this); //创建状态栏 UINT Indicates[4]; for (int i = 0; i<4;i++) { Indicates[i]=50+i; //为数组元素赋值 } m_StatusBar.SetIndicators(Indicates,4); //设置面板ID m_StatusBar.GetStatusBarCtrl().SetMinHeight(30); //设置面板高度 CRect rect; GetClientRect(rect); //获得窗体客户区域 UINT PaneWidth=rect.Width()/5; //计算面板宽度 for(int n = 0;n<4;n++) { m_StatusBar.SetPaneInfo(n,50+n*10,SBPS_NORMAL,PaneWidth); //设置面板宽度 } //设置状态栏面板文本 m_StatusBar.SetPaneText(0,"用户名称"); m_StatusBar.SetPaneText(1,"明日科技"); m_StatusBar.SetPaneText(2,"动画"); m_Animate.SetParent(&m_StatusBar); //设置动画控件的父窗口为状态栏 //显示状态栏 RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); CRect Rect; m_StatusBar.GetStatusBarCtrl().GetRect(3,&Rect); //获得面板区域 CRect ProgRect(Rect.left,2,Rect.right,Rect.Height()+2); //设置显示位置 m_Animate.MoveWindow(ProgRect); //移动动画控件位置 m_Animate.Open("dmt.avi"); //打开AVI文件 m_Animate.Play(0,-1,-1); //播放AVI文件
举一反三
根据本实例,读者可以:
设计播放FLASH动画的状态栏。
实例013 滚动字幕的状态栏
这是一个可以启发思维的实例
实例位置:光盘\mingrisoft\01\013
实例说明
在火车站、客运站等许多公共场所,随处可以看见一个大屏幕,上面经常会以滚动字幕的形式显示一些信息。本实例实现了一个滚动字幕的状态栏,效果如图1.17所示。
图1.17 滚动字幕的状态栏
技术要点
在状态栏中实现滚动字幕,可以利用静态文
本控件实现。在状态栏中显示一个静态文本控件,
然后每隔一段时间调整静态文本控件的位置,即可实现滚动字幕的效果了。
实现过程
(1)新建一个基于对话框的应用程序。
(2)在对话框中放置两个静态文本控件,通过属性窗口设置控件的ID和Caption属性。
(3)通过类向导将两个静态文本控件分别命名为m_Parent和m_Web。
(4)在对话框类的OnInitDialog方法中创建状态栏,将静态文本控件显示在状态栏中,代码如下:
m_StatusBar.Create(this); //创建状态栏 UINT Indicates[4]; for (int i = 0; i<4;i++) { Indicates[i]=50+i; //为数组元素赋值 } m_StatusBar.SetIndicators(Indicates,4); //设置面板ID CRect rect; GetClientRect(rect); //获得控件的客户区域 UINT PaneWidth=rect.Width()/6; //计算面板宽度 //设置面板宽度 for(int n = 0;n<3;n++) { m_StatusBar.SetPaneInfo(n,50+n*10,SBPS_NORMAL,PaneWidth); //设置面板宽度 } //设置状态栏面板文本 m_StatusBar.SetPaneInfo(3,111,SBPS_NORMAL,800); m_StatusBar.SetPaneText(0,"用户名称"); m_StatusBar.SetPaneText(1,"明日科技"); m_StatusBar.SetPaneText(2,"网址"); RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);//显示状态栏 //设置静态文本控件的父窗口为状态栏 m_Parent.SetParent(&m_StatusBar); m_StatusBar.GetStatusBarCtrl().GetRect(3,Rect); //获取控件的显示区域 Rect.DeflateRect(1,1,1,1); //设置区域 m_Parent.MoveWindow(Rect); //移动控件位置 m_Parent.GetClientRect(Rect); //获得控件的客户区域 m_Web.GetClientRect(rect1); //获得控件的客户区域 m_Web.SetParent(&m_Parent); //设置控件的父窗口 m_Parent.GetClientRect(CurRect); //获得控件的客户区域 CurRect.DeflateRect(0,1,Rect.Width()-rect1.Width(),1); /设置控件要移动到的区域 m_Web.MoveWindow(CurRect); //移动控件 SetTimer(1,200,NULL); //设置定时器
(5)处理对话框的WM_TIMER消息,代码如下:
void CScrollStatusDlg::OnTimer(UINT nIDEvent) { if(CurRect.left>=Rect.right) //如果移动区域左边大于等于面板右边界 { CurRect.left=Rect.left-rect1.Width(); //设置移动区域左边界 CurRect.right=Rect.left; //设置移动区域右边界 } else //否则 { CurRect.left+=4; //设置移动区域左边界+4 CurRect.right+=4; //设置移动区域右边界+4 } //调整控件位置 m_Web.MoveWindow(CurRect); }
举一反三
根据本实例,读者可以:
设计滚动字幕的工具栏。