分类: Windows平台
2014-11-19 10:17:36
VS2010提供了CMFCStatusBar用于控制状态栏的显示,在状态栏中,可以显示图标、进度条、图形动画、更改文本的颜色和背景色、双机相应状态栏产生消息。
首先利用AppWizard建立工程文件,注意建立的工程文件视类的基类选择为CFormView,在CMainFrame中定义状态栏并设置状态栏。
依据状态栏中出现的次序定义常量,确定修改哪一个状态栏。
const int nStatusIcon = 0;
const int nStatusInfo = 1;
const int nStatusProgress = 2;
const int nStatusLabel = 3;
const int nStatusAnimation =4;
重新修改状态栏的标识函数
static UINT indicators[] =
{
ID_INDICATOR_ICON, //status icon
ID_SEPARATOR, // statusline indicator
ID_INDICATOR_PROGRESS, // progress bar
ID_INDICATOR_LABEL, // textlabel
ID_INDICATOR_ANIMATION, // animation pane
};
设置状态栏的格式
m_wndStatusBar.SetPaneStyle(nStatusIcon, SBPS_NOBORDERS);
m_wndStatusBar.SetPaneStyle(nStatusAnimation, SBPS_NOBORDERS);
m_wndStatusBar.SetPaneStyle(nStatusInfo, SBPS_STRETCH | SBPS_NOBORDERS);
m_wndStatusBar.SetPaneWidth(nStatusProgress, 80);
m_wndStatusBar.EnablePaneDoubleClick();
编辑Form资源,加入需要的控件并编程。
要在视类中访问状态栏控件,需要编写函数GetStatusBar()
CMFCStatusBar&GetStatusBar () const
{
return ((CMainFrame*) AfxGetMainWnd ())->GetStatusBar();
}
另外,在CMainFrame中加入GetStatusBar代码
CMFCStatusBar&GetStatusBar ()
{
return m_wndStatusBar;
}
视类的初始化,修改OnInitialUpdate函数并加入状态栏相关的控件初始化代码
//动画图标的载入
if(m_imlStatusAnimation.GetSafeHandle()==NULL)
{
m_imlStatusAnimation.Create(IDB_ANIMATE,16,0,RGB(255,0,255));
}
//位图图标的载入
if(m_bmpIcon1.GetSafeHandle() == NULL)
{
m_bmpIcon1.LoadBitmapW(IDB_ICON1);
}
//位图图标的载入
if(m_bmpIcon2.GetSafeHandle() == NULL)
{
m_bmpIcon2.LoadBitmapW(IDB_ICON2);
}
//载入图标
GetStatusBar().SetPaneIcon(nStatusIcon,m_bmpIcon1);
GetStatusBar().SetTipText(nStatusIcon,_T("this is tooltip"));
进度条的启动和停止
if(m_ShowProgress)
{
KillTimer(ID_PROGRESS_TIMER);
m_ProgressBut.SetWindowTextW(_T("Show Progress"));
GetStatusBar().EnablePaneProgressBar (nStatusProgress, -1);
m_ShowProgress= FALSE;
return;
}
SetTimer(ID_PROGRESS_TIMER,100,NULL);
GetStatusBar().EnablePaneProgressBar (nStatusProgress, PROGRESS_MAX);
m_ShowProgress= TRUE;
m_ProgressBut.SetWindowTextW(_T("Stop Progress"));
在WM_TIMER中加入动态进度条的控制代码
if(nIDEvent == ID_PROGRESS_TIMER)
{
nProgressPos+=5;
if(nProgressPos > PROGRESS_MAX)
{
nProgressPos= 0;
}
GetStatusBar().SetPaneProgress(nStatusProgress, nProgressPos);
}
动画演示的启动和停止
if(m_ShowAnimation)
{
m_ShowAnimation= FALSE;
m_AnimateBut.SetWindowTextW(_T("Start Animation"));
GetStatusBar().SetPaneAnimation (nStatusAnimation, NULL);
}
else
{
m_ShowAnimation= TRUE;
m_AnimateBut.SetWindowTextW(_T("Stop Animation"));
GetStatusBar().SetPaneAnimation (nStatusAnimation, m_imlStatusAnimation);
GetStatusBar().SetPaneText (nStatusAnimation, _T(""));
GetStatusBar().SetPaneWidth (nStatusAnimation, 16);
}
图标的变换
If(m_nIcon==0)
{
return;
}
m_nIcon= 0;
GetStatusBar().SetPaneIcon (nStatusIcon, m_bmpIcon1);
背景色和显示文本颜色的改变
m_backColor= m_BackColorBut.GetColor();
GetStatusBar().SetPaneBackgroundColor(nStatusLabel,m_backColor);
m_textColor= m_TextColorBut.GetColor();
GetStatusBar().SetPaneTextColor(nStatusLabel,m_textColor);
鼠标双击状态栏消息的建立
可以利用状态栏的ID建立ON_COMMAND消息并建立处理函数,在其中相应该函数即可
最终软件界面如下: