Visual C++程序开发范例宝典(软件工程师典藏版)
上QQ阅读APP看书,第一时间看更新

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);
        }

举一反三

根据本实例,读者可以:

设计滚动字幕的工具栏。