9.5創(chuàng)建進(jìn)度條
MFC中,有一個(gè)CProgressCtrl的類,如果要?jiǎng)?chuàng)建一個(gè)進(jìn)度條,首先需要?jiǎng)?chuàng)建一個(gè)CProgressCtrl類的對象,然后調(diào)用Create成員函數(shù)來創(chuàng)建。MSDN中給出了一個(gè)相關(guān)的實(shí)例程序。
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)建一個(gè)進(jìn)度條?
狀態(tài)欄屬于框架類,在狀態(tài)欄中創(chuàng)建進(jìn)度條,首先同樣需要獲取創(chuàng)建的區(qū)域。這之前需要String表中添加進(jìn)度條的字串。然后將字串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,//用來顯示進(jìn)度條區(qū)域
8 };
為了獲取進(jìn)度條所處于的區(qū)域,可以調(diào)用GetItemRect函數(shù)。
void GetItemRect(index,LPRECT lprect) const;其中第一個(gè)參數(shù)為狀態(tài)欄中網(wǎng)格的在indicators[]中的索引號。由于OnCreate函數(shù)實(shí)際上是響應(yīng)的WM_ OnCreate函數(shù),只有在這個(gè)函數(shù)完成之后才能獲取到狀態(tài)欄的矩形區(qū)域。因此需要在此處添加一個(gè)消息響應(yīng)函數(shù),等窗口創(chuàng)建完成之后,發(fā)送生成進(jìn)度條消息。
MFC的每個(gè)標(biāo)準(zhǔn)消息都有一個(gè)消息編號,要?jiǎng)?chuàng)新一個(gè)新的消息,首先要?jiǎng)?chuàng)建消息編號。
1、 在Frame的頭文件中添加一個(gè)消息標(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)欄動(dòng)態(tài)創(chuàng)建一個(gè)進(jìn)度條。這里有個(gè)一SendMessage函數(shù)和PostMessage函數(shù)的區(qū)別說明。
1、 SendMessage:直接把消息發(fā)送給消息響應(yīng)函數(shù),等消息響應(yīng)函數(shù)處理完之后再返回。
2、 PostMessage:把消息發(fā)送到消息隊(duì)列,然后立即返回。
由于OnProgress函數(shù)需要在OnCreate執(zhí)行完之后再響應(yīng),因此此處采用PostMessage函數(shù)來發(fā)送該消息。
創(chuàng)建進(jìn)度條完成之后,顯示正常,但是如果此時(shí)拉動(dòng)窗口,改變大小,會(huì)發(fā)現(xiàn)進(jìn)度條的位置不正確了,為了保證進(jì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消息是自動(dòng)執(zhí)行的,這樣就不需要在OnCreate函數(shù)中再添加PostMessage函數(shù)來發(fā)送消息了。
完成進(jìn)度條的創(chuàng)建之后,可以再OnTimer函數(shù)中添加代碼,實(shí)現(xiàn)進(jìn)度條的動(dòng)態(tài)效果,代碼就不貼上來了,都是調(diào)用相關(guān)函數(shù)來實(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)推薦:
2012年計(jì)算機(jī)等考四級數(shù)據(jù)庫工程師備考筆記匯總
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |