MFC实例学习(1)----状态栏

来源:互联网 发布:网络平台贷款是否合法 编辑:程序博客网 时间:2024/04/30 14:25

状态栏是程序中应用较多的元件之一。下面就状态栏应用中的问题进行汇总。

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类。

原创粉丝点击