状态栏是程序中应用较多的元件之一。下面就状态栏应用中的问题进行汇总。
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);//清理现场
总结:用到了CTime类,CStatusBar类,CStatic类,CFont类。