9.5創(chuàng)建進度條
MFC中,有一個CProgressCtrl的類,如果要創(chuàng)建一個進度條,首先需要創(chuàng)建一個CProgressCtrl類的對象,然后調(diào)用Create成員函數(shù)來創(chuàng)建。MSDN中給出了一個相關(guān)的實例程序。
1 CProgressCtrl myCtrl;
2 // Create a smooth child progress control.
3 myCtrl.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH, CRect(10,10,200,30),
4 pParentWnd, 1);
如何要在狀態(tài)欄中創(chuàng)建一個進度條?
狀態(tài)欄屬于框架類,在狀態(tài)欄中創(chuàng)建進度條,首先同樣需要獲取創(chuàng)建的區(qū)域。這之前需要String表中添加進度條的字串。然后將字串ID添加到:
1 static UINT indicators[] =
2 {
3 ID_SEPARATOR, // status line indicator
4 ID_INDICATOR_CAPS,
5 ID_INDICATOR_NUM,
6 ID_INDICATOR_SCRL,
7 IDS_PROGRESS,//用來顯示進度條區(qū)域
8 };
為了獲取進度條所處于的區(qū)域,可以調(diào)用GetItemRect函數(shù)。
void GetItemRect(index,LPRECT lprect) const;其中第一個參數(shù)為狀態(tài)欄中網(wǎng)格的在indicators[]中的索引號。由于OnCreate函數(shù)實際上是響應(yīng)的WM_ OnCreate函數(shù),只有在這個函數(shù)完成之后才能獲取到狀態(tài)欄的矩形區(qū)域。因此需要在此處添加一個消息響應(yīng)函數(shù),等窗口創(chuàng)建完成之后,發(fā)送生成進度條消息。
MFC的每個標(biāo)準(zhǔn)消息都有一個消息編號,要創(chuàng)新一個新的消息,首先要創(chuàng)建消息編號。
1、 在Frame的頭文件中添加一個消息標(biāo)識宏#define UM_PROGRESS WM_USER+1;
2、 按照標(biāo)準(zhǔn)消息的格式和流程,分別在頭文件和源文件中添加消息映射。
頭文件
1 //{{AFX_MSG(CMainFrame)
2 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
3 afx_msg void OnTimer(UINT nIDEvent);
4 afx_msg void OnPaint();
5 afx_msg void OnProgress();//消息
6 //}}AFX_MSG
源文件
1 //{{AFX_MSG_MAP(CMainFrame)
2 ON_WM_CREATE()
3 ON_WM_TIMER()
4 ON_WM_PAINT()
5 ON_MESSAGE(UM_PROGRESS,OnProgress) //消息
6 //}}AFX_MSG_MAP
3、 在源文件中添加消息響應(yīng)函數(shù)
1 void CMainFrame::OnProgress()
2 {
3 CRect rect;
4 m_wndStatusBar.GetItemRect(5,&rect);
5 m_cpc.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH,rect,&m_wndStatusBar,123);
6 m_cpc.SetPos(50);
7 }
4、 在源文件的OnCreate函數(shù)中添加PostMessage(UM_PROGRESS);
這樣便可以在狀態(tài)欄動態(tài)創(chuàng)建一個進度條。這里有個一SendMessage函數(shù)和PostMessage函數(shù)的區(qū)別說明。
1、 SendMessage:直接把消息發(fā)送給消息響應(yīng)函數(shù),等消息響應(yīng)函數(shù)處理完之后再返回。
2、 PostMessage:把消息發(fā)送到消息隊列,然后立即返回。
由于OnProgress函數(shù)需要在OnCreate執(zhí)行完之后再響應(yīng),因此此處采用PostMessage函數(shù)來發(fā)送該消息。
創(chuàng)建進度條完成之后,顯示正常,但是如果此時拉動窗口,改變大小,會發(fā)現(xiàn)進度條的位置不正確了,為了保證進度條的位置正確,需要添加OnPaint函數(shù)。
01 void CMainFrame::OnPaint()
02 {
03 CPaintDC dc(this); // device conText for painting
04 // TODO: Add your message handler code here
05 CRect rect;
06 m_wndStatusBar.GetItemRect(5,&rect);
07 if(!m_cpc.m_hWnd)
08 {
09 m_cpc.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH,rect,&m_wndStatusBar,123);
10 }
11 else
12 {
13 m_cpc.MoveWindow(rect);
14 }
15 m_cpc.SetPos(50);
16 // Do not call CFrameWnd::OnPaint() for painting messages
17 }
因此WM_PAINT消息是自動執(zhí)行的,這樣就不需要在OnCreate函數(shù)中再添加PostMessage函數(shù)來發(fā)送消息了。
完成進度條的創(chuàng)建之后,可以再OnTimer函數(shù)中添加代碼,實現(xiàn)進度條的動態(tài)效果,代碼就不貼上來了,都是調(diào)用相關(guān)函數(shù)來實現(xiàn)。
9.6在狀態(tài)欄上顯示鼠標(biāo)
在View類上添加WM_MOUEOVER函數(shù)
1 void CStyleView::OnMouseMove(UINT nFlags, CPoint point)
2 {
3 // TODO: Add your message handler code here and/or call default
4 CString str;
5 str.Format("x=%d y=%d",point.x,point.y);
6 ((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);
7 CView::OnMouseMove(nFlags, point);
8 }
這之前需要在View類中引入Frame類的頭文件,并將Frame類的m_wndStatusBar設(shè)置為public。
相關(guān)推薦:
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |