状态栏编程实例

状态栏介绍


一般情况下,应用程序的最下方就是状态栏,主要应用于信息提示,如图1所示。


 状态栏分为两部分,第一部分是左边最长的那部分就是提示行,当我们把鼠标移动到某个工具栏按钮或者菜单项时,这个部分就会显示对应的提示信息。这个提示信息是在菜单项或者工具栏按钮的Prompt属性中完成的。

第二部分是其右边的三个窗格,主要用来显示Caps Lock,Num Lock和Scroll Lock键的状态,称为状态指示器。我们可以自由的删增状态指示器,指示器标题在资源栏的String Table中进行修改,修改过程下面再详细介绍,如图2所示:



创建状态栏


创建步骤:

1. 构造CStatusBar对象,做为主框架类的成员函数。 
2. 调用Create(或CreateEx)函数来创建状态条窗口并将它连接到CStatusBar对象,需要在主框架窗口创建之后调用 
3. 调用SetIndicators函数将字符串ID与每一个指示器联系起来。  


具体代码:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;
    ...
    //创建状态栏窗口,m_wndStatusBar是CMainFrame类的成员函数
    if (!m_wndStatusBar.Create(this))
    {   
        return -1;
    }
    //设置指示器ID 
    if (!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)))
    {
        return -1;      // 未能创建
    }
    
    return 0;
}
其中 indicators是指示器数组ID,是个静态的变量,其 数组元素的顺序就决定了指示器窗格属性,我们可以在这个静态数组中删增或调整数组元素,以完成相应的用户个性化需求,默认的代码如下:

static UINT indicators[] =
{
	ID_SEPARATOR,           // 状态行指示器
        ID_INDICATOR_NUM,
	ID_INDICATOR_CAPS,	
	ID_INDICATOR_SCRL,
};

新增指示器


现在我们在原有基础上增加两个指示器,用于指示“时间”和“进度”信息,其新增的ID分别是ID_INDICATOR_TIMER和ID_INDICATOR_PROGRESS,具体代码如下:

static UINT indicators[] =
{
    ID_SEPARATOR,           // 状态行指示器
    ID_INDICATOR_TIMER,     //时间指示器,新增
    ID_INDICATOR_PROGRESS,  //进度指示器,新增
    ID_INDICATOR_NUM,
    ID_INDICATOR_CAPS,	
    ID_INDICATOR_SCRL,
};

运行效果:



函数详解


Create函数用于创建状态栏并和状态类对象相绑定,其函数声明和注解如下:

BOOL Create( CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_BOTTOM, UINT nID = AFX_IDW_STATUS_BAR );

返回值:
    如果成功则返回非零值;否则返回0。
参数: 
pParentWnd 
    指向一个CWnd对象的指针,该对象的Windows窗口是此状态条的父窗口。 
dwStyle 
    状态条风格。除标准的Windows风格之外,还支持下列风格: 
    · CBRS_TOP 控制条在框架窗口的顶部。  
    · CBRS_BOTTOM 控制条在框架窗口的底部。  
    · BRS_NOALIGN 当父窗口的尺寸发生变化时不重新定位控制条。   
nID 
    工具条的子窗口ID。  
说明:
此成员函数用来创建一个状态条(一个子窗口)并将它与CStatusBar对象连接。还将状态条的初始字体和高度设置为缺省值。

SetIndicators用于指定指示器ID,其函数声明和注解如下:

BOOL SetIndicators( const UINT* lpIDArray, int nIDCount );

返回值:如果成功则返回非零值;否则返回0。

参数: lpIDArray 指向一个ID数组的指针。  
nIDCount 由lpIDArray指向的数组的元素数目。  

说明:
此成员函数用来将每一个指示器的ID设置为由数组lpIDArray的相应元素指定的值
加载由每一个ID指定的字符串资源,并将这个字符串设置为此指示器的文本。
SetPaneText主要用来设置窗格信息,其函数声明如下:
BOOL SetPaneText( int nIndex, LPCTSTR lpszNewText, BOOL bUpdate = TRUE );

返回值:
    如果成功则返回非零值;否则返回0。
参数: 
nIndex 要设置其文本的窗格的索引。  
lpszNewText 指向新的窗格文本的指针。  
bUpdate 如果是TRUE,则在文本被设置之后,窗格是无效的。  
说明:
此成员函数用来将窗格文本设置为由lpszNewText指定的字符串。
SetPaneInfo可以用来设置指示器窗格的新ID,风格和宽度信息,其函数声明如下:

void SetPaneInfo( int nIndex, UINT nID, UINT nStyle, int cxWidth );

参数: 
nIndex  要设置其风格的指示器窗格的索引。  
nID     该指示器窗格的新ID。  
nStyle  该指示器窗格的新风格。  
cxWidth 该指示器窗格的新宽度。  


显示系统时间


现在我们在状态栏的时间窗格上显示系统当前时间,最小精度为秒,为了达到实时刷新的效果,我们需要引入定时器功能,代码步骤如下:

1.主框架的OnCreate函数return之前第一次设置时间窗格信息

2.OnCreate函数中启动定时器开关,频率是1s

3.在WM_TIMER消息函数中再次设置时间窗格信息,用于实时刷系统时间

具体代码如下:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;
    ...
    if (!m_wndStatusBar.Create(this) ||
        !m_wndStatusBar.SetIndicators(indicators,
        sizeof(indicators)/sizeof(UINT)))
    {
        TRACE0("未能创建状态栏\n");
        return -1;      // 未能创建
    }
    ...
    //窗口创建时的时间
    SetTimerPaneInfo();
    //设置定时器,用于实时显示
    SetTimer(ENUM_INDICATOR_TIMER_ID,1000, NULL);
    return 0;
}
刷新时间定时器
void CMainFrame::OnTimer(UINT_PTR nIDEvent)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认
    if (ENUM_INDICATOR_TIMER_ID == nIDEvent)
    {
        SetTimerPaneInfo();
    }

    CFrameWnd::OnTimer(nIDEvent);
}
主要功能实现代码
/****************************************************************
*函数名称:SetTimerPaneInfo
*功    能:设置状态栏的系统当前时间
*作    者:Jin
*日    期:2016年11月27日
****************************************************************/
void CMainFrame::SetTimerPaneInfo()
{
    CClientDC dc(this);
    CTime   Time    = CTime::GetCurrentTime();
    CString strTime = Time.Format("%H:%M:%S");
    //确保时间指示器的足够容纳下时间字符串
    CSize   sz      = dc.GetTextExtent(strTime);

    int nTimerIndex = m_wndStatusBar.CommandToIndex(ID_INDICATOR_TIMER);
    if (nTimerIndex != -1)
    {
        m_wndStatusBar.SetPaneInfo(nTimerIndex, //指示器索引
                                   ID_INDICATOR_TIMER,//指示器ID
                                   SBPS_NOBORDERS,  //指示器风格
                                   sz.cx); //指示器宽度
        //显示系统时间
        m_wndStatusBar.SetPaneText(nTimerIndex,strTime);
    }
}
运行效果:



CStatusBar类成员


构造

CStatusBar构造一个CStatusBar对象
Create创建状态条,并将它与CStatusBar对象连接,且设置初始字体和条高度
CreateEx创建一个具有嵌入CStatusBarCtrl对象附加风格的CStatusBar对象
SetIndicators设置指示器ID

属性
CommandToIndex获取给定指示器ID的索引
GetItemID获取给定索引的指示器ID
GetItemRect获取给定索引值的显示矩形
GetPaneInfo获取一个给定索引的指示器ID,风格和宽度
SetPaneInfo设置一个给定索引的指示器ID,风格和宽度
GetPaneStyle获取一个给定索引的指示器风格
SetPaneStyle设置一个给定索引的指示器风格
GetPaneText获取一个给定索引的指示器文本
SetPaneText设置一个给定索引的指示器文本
GetStatusBarCtrl允许直接访问基础通用控件

可重载
DrawItem当一个属主绘制的状态条控件的外观改变时,此函数被调用 


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值