MFC状态栏编程(显示系统时间和进度条)
顯示系統(tǒng)時(shí)間
1、?在狀態(tài)欄中設(shè)置兩個(gè)新的欄位Timer和Progress。首先到ResourceView中編輯String Table,增加IDS_TIMER(時(shí)間),PROGRESS(進(jìn)度)。然后在MainFrame中修改indicators數(shù)組,插入IDS_TIMER和IDS_PROGRESS。插入的位置,即為顯示的位置。(添加字符串必須將字符串說明也寫上,不然無法新建)在CMainFrame中添加CProgressCtrl m_Progress;
2、?現(xiàn)在我們讓狀態(tài)欄上的IDS_TIMER的位置顯示系統(tǒng)當(dāng)前的時(shí)間。我們只要在MainFrame的OnCreate函數(shù)中寫入:
?CTimet=CTime::GetCurrentTime();??????????//獲得當(dāng)前的系統(tǒng)時(shí)間
CClientDC dc(this);
CSizesz=dc.GetTextExtent(str);??????????????//設(shè)置一個(gè)CClientDC對(duì)象來獲取str的長度
CStringstr=t.Format("%H:%M:%S");???????//格式可以參考MSDN中的strftime函數(shù)
?int index=0;
?index=m_wndStatusBar.CommandToIndex(IDS_TIMER);?????
//此處也可以直接輸入IDS_TIMER在indicators數(shù)組中從0開始的序號(hào)。
//設(shè)置狀態(tài)欄寬度
?m_wndStatusBar.SetPaneInfo(index,IDS_TIMER,SBPS_NORMAL,sz.cx);????
?m_wndStatusBar.SetPaneText(index,str);????????????//設(shè)置IDS_TIMER指示器字符串
3、?在OnCreate函數(shù)中添加SetTimer(1,1000,NULL);語句,讓后為CMainFrame類添加WM_TIMER消息相應(yīng)函數(shù),在OnTimer函數(shù)中將上述代碼復(fù)制進(jìn)去,就可以實(shí)現(xiàn)隨時(shí)變化時(shí)間的狀態(tài)欄。?
添加進(jìn)度條:
1、?現(xiàn)在我們將狀態(tài)欄中的PROGRESS欄位顯示一個(gè)50%的進(jìn)度欄。如果我們只是簡單的在MainFrame的OnCreate函數(shù)中寫入以下代碼:
CRect rect;
?/*獲取IDS_PROGRESS欄位的CRect值,付給rect*/
?m_wndStatusBar.GetItemRect(m_wndStatusBar.CommandToIndex(IDS_PROGRESS),&rect);???
/*在IDS_PROGRESS的位置顯示一個(gè)50%的進(jìn)度欄*/
?m_progress.Create(WS_CHILD|WS_VISIBLE,rect,m_wndStatusBar,123);????
?m_progress.SetPos(50);
2、?你會(huì)發(fā)現(xiàn)IDS_PROGRESS欄位仍然顯示的是“進(jìn)度”兩個(gè)字。這是為什么呢?原因是因?yàn)?#xff0c;在OnCreate函數(shù)中,窗臺(tái)和狀態(tài)欄并沒有真正創(chuàng)建完畢,所以GetItemRect函數(shù)無法獲取IDS_PROGRESS欄位的CRect值。解決的辦法是,添加一個(gè)自定義的消息,把消息放入消息隊(duì)列,等窗體和狀態(tài)欄創(chuàng)建完畢后,再通過消息響應(yīng),創(chuàng)建進(jìn)度欄。
添加自定義消息
1、?在MainFrame頭文件中添加自定義消息
#define WM_PROGRESS WM_USER+1
2、?然后在頭文件中添加消息響應(yīng)函數(shù)
afx_msg LRESULT OnProgress(WPARAMwParam,LPARAM lParam);
在cpp文件中添加消息映射
ON_MESSAGE(WM_PROGRESS,CMainFrame::OnProgress)
3、?寫消息響應(yīng)函數(shù):
void CMainFrame::OnProgress()
{
???CRect rect;
???m_wndStatusBar.GetItemRect(m_wndStatusBar.CommandToIndex(IDS_PROGRESS),&rect);
???if(m_Progress.GetSafeHwnd() == nullptr)
?????? m_Progress.Create(WS_CHILD|WS_VISIBLE,rect, &m_wndStatusBar, 123);
??? else m_Progress.ShowWindow(SW_SHOW);
???m_progress.SetPos(50);
}
4、?去掉上一個(gè)步驟在OnCreate中添加的語句。
然后在OnCreate函數(shù)最后添加如下語句:
PostMessage(WM_PROGRESS);
注意這里要用PostMessage不能用SendMessage,否則系統(tǒng)會(huì)先處理OnProgress消息響應(yīng),然后再創(chuàng)建窗體,出現(xiàn)仍看不見進(jìn)度欄的情況。必須用PostMessage先把消息放入消息響應(yīng)隊(duì)列當(dāng)中,等窗體創(chuàng)建完畢后,系統(tǒng)再處理OnProgress函數(shù)。
5、?這時(shí)就可以看見進(jìn)度跳了,但是還有個(gè)問題,當(dāng)窗口大小改變時(shí),進(jìn)度條會(huì)離開IDS_PROGRESS狀態(tài)欄的位置。可以使用下面的方法解決。
狀態(tài)欄隨窗口改變大小
1、?為MainFrame添加WM_SIZE消息相應(yīng)函數(shù),并添加如下代碼:
void CMainFrame::OnSize(UINT nType,int cx, int cy)
{
?????? CFrameWndEx::OnSize(nType, cx, cy);
?
?????? // TODO: 在此添加消息處理程序代碼
?????? if(m_wndStatusBar.GetSafeHwnd() != nullptr)
??? {
?????? CRectrect;
?????? m_wndStatusBar.GetItemRect(1,&rect);
?????? if(m_Progress.GetSafeHwnd() != nullptr)
?????? {
?????????? m_Progress.SetWindowPos(&wndTop,rect.left, rect.top,
????????????? rect.right- rect.left, rect.bottom - rect.top, 0);
?????? }
??? }
}
?
顯示鼠標(biāo)位置
1.??????現(xiàn)在我們要讓狀態(tài)欄上顯示鼠標(biāo)在窗口中的坐標(biāo)。由于View窗體在MainFrame框架前,所以我們要響應(yīng)的是View窗體上OnMouseMove事件。
2.??????首先我們?cè)?/span>View類中右鍵新建一個(gè)window消息響應(yīng)函數(shù),添加一個(gè)WM_MOUSEMOVE的消息響應(yīng)函數(shù)。添加如下代碼:
???????CStringstr;
???????str.Format(_T("x=%d,y=%d"),point.x,point.y);????????????????????/*對(duì)鼠標(biāo)坐標(biāo)進(jìn)行格式化*/
?????((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);??????
/*由于作用的是View窗口的父窗口MainFrame下的m_wndStatusBar對(duì)象,所以必須將m_wndStatusBar設(shè)置為public,然后用(CMainFrame*)指名其為框架類指針,否則->后面不會(huì)出現(xiàn)m_wndStatusBar對(duì)象。注意在View程序中必須包含MainFrame的頭文件*/
也可以將最有一句改為:?((CMainFrame*)GetParent())->SetMessageText(str);直接由框架類函數(shù)中的SetMessageText實(shí)現(xiàn)對(duì)狀態(tài)欄文字的更改。
3.??????第三種實(shí)現(xiàn)方法是:?((CMainFrame*)GetParent())->GetMessageBar()->SetWindowText(str);通過框架類函數(shù)GetMessageBar來獲得指向狀態(tài)欄窗口的指針。這種方法的好處是,不需要再把MainFrame中的m_wndStatusBar設(shè)置為public。
4.??????第四種方法:?GetParent()->GetDescendantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(str);?因?yàn)?/span>GetDescendantWindow本來就是CWnd的成員函數(shù),所以不需要轉(zhuǎn)換為框架類對(duì)象,并根據(jù)ID號(hào),來獲得子孫窗口的對(duì)象指針,這里的AFX_IDW_STATUS_BAR,是由CStatusBar::Create默認(rèn)產(chǎn)生的。
?
?
總結(jié)
以上是生活随笔為你收集整理的MFC状态栏编程(显示系统时间和进度条)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第一篇博客测试
- 下一篇: 状态栏编程(显示系统时间和进度条)