状态栏

本文详细介绍了如何在Windows应用程序中创建并定制状态栏,包括去除默认尺寸调整握柄、添加居中文本显示、设置字体与颜色及实现实时时间显示等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1)状态栏的创建
CStatus m_wndStatusBar;//声明状态栏控件
static UINT indicators[] =
{
 ID_FIRST,// status line indicator
 ID_INDICATOR_MAIN,
 ID_INDICATOR_END,
};
//声明状态栏的指示器。

if (!m_wndStatusBar.Create(this) ||!m_wndStatusBar.SetIndicators(indicators,
 sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar/n");
return -1;
      // fail to createWM_SIZEPARENT
}//创建状态栏的语句

m_wndStatusBar.SetPaneInfo(0,ID_FIRST,SBPS_NORMAL,100);
m_wndStatusBar.SetPaneInfo(1,ID_INDICATOR_MAIN,SBPS_POPOUT|SBPS_STRETCH,0);
m_wndStatusBar.SetPaneInfo(2,ID_INDICATOR_END,SBPS_NORMAL,100);
以上语句设置状态栏的窗格的大小,这里设置第一和第三格大小相同,第二格凸出显示,并且占有了其它的长度。

2)一般上面创建的状态栏都有SBARS_SIZEGRIP,下面派生一个状态栏类CMyStatusBar,在PreCreateWindow中修改掉SBARS_SIZEGRIP属性。
BOOL CMyStatusBar::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style &= SBARS_SIZEGRIP;
return CStatusBar::PreCreateWindow(cs);
}

3)在状态栏中添加静态控件,用于使文字在状态栏中的显示呈居中对齐,这里设置第二个格中的文字居中对齐。
CStatic m_static;//在上面的派生类中添加控件变量相应WM_CREATE消息

int CMyStatusBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
lpCreateStruct->style|=WS_CLIPCHILDREN;

if (CStatusBar::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
CRect rect;
GetItemRect(1,&rect);
m_static.Create("大学",WS_CHILD|WS_VISIBLE|SS_CENTER,rect,this,1);
//静态控件的大小和第二格的大小相同,并且标题居中显示
return 0;
}

下面相应WM_SIZE以使静态控件在窗格尺寸发生改变的时候能相应改变
void CMyStatusBar::OnSize(UINT nType, int cx, int cy)
{
CStatusBar::OnSize(nType, cx, cy);
CRect rect;
GetItemRect(1,&rect);
m_static.MoveWindow(rect,TRUE);
}

下面设置静态控件的文字字体和颜色,相应WM_CTLCOLOR
HBRUSH CMyStatusBar::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CStatusBar::OnCtlColor(pDC, pWnd, nCtlColor);
if(pWnd->GetDlgCtrlID()==1)
{
    CFont font;
    font.CreateFont(18,0,0,0,900,TRUE,FALSE,FALSE,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS
     ,CLIP_DEFAULT_PRECIS,0,DEFAULT_PITCH,"宋体");
    pDC->SelectObject(&font);
    pDC->SetTextColor(RGB(0,0,255));
       pDC->SetBkMode(TRANSPARENT);
}
return hbr;
}

至此,状态栏的文字居中显示了。

4)在状态栏显示时间,这里在最后一个窗格显示时间
首先在框架窗口的OnCreate函数中添加计时器:SetTimer(2,1000,NULL);
然后为第三个窗格添加更新响应函数;过程为:
 (1)声明消息映射函数 afx_msg void OnUpdateEnd(CCmdUI* pCmdUI);
 (2)添加消息映射:ON_COMMAND_UPDTAE_UI (ID_INDICATOR_END,OnUpdateEnd)
 (3)编写响应函数:
void CMainFrame::OnUpdateEnd(CCmdUI* pCmdUI)
{
    CTime tm;
   CString str;
    tm=CTime::GetCurrentTime();
    str=tm.Format("%H:%M:%S");
    str.Insert(0,"当前时间:");
    pCmdUI->SetText(str);
}

相应WM_TIMER消息
void CMainFrame::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CTime tm;
CString str;
tm=CTime::GetCurrentTime();
str=tm.Format("%H:%M:%S");
str.Insert(0,"当前时间:");
m_wndStatusBar.SetPaneText(2,str);
CFrameWnd::OnTimer(nIDEvent);
}
//能够发出更新消息最后在框架WM_CLOSE中添加KillTimer(2);清理现场

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值