最近在學習MFC,程序設計老師布置”畫板“和”模擬時鍾“作為實驗來實踐,由於沒去上課,網上搜索的很多教程幾乎都是以VC6.0為基礎的,而身邊幾乎都是VS2008以上,對於初學者來說,有時仿照VC6.0的教程在VS2008或更高的環境上難免會出現一些困難,特此將模擬時鍾程序在VS2008環境下的開發過程總結如下:
1.新建項目
項目類型選擇“MFC”,模板選擇“MFC應用程序”,名稱自擬,這里命名為”Clock"。選擇好以后效果如下:
2.MFC應用程序向導設置
選擇“下一步"
這里有兩個更改,一是”應用程序類型”選擇“基於對話框”,同時取消選中“使用Unicode庫”。完成以上兩步之后,直接單擊“完成”即可。
三、核心部分
1.首先打開“類視圖”,選擇"CClockDlg"
在該類的頭文件中,找到如下代碼:
緊接着后面添加三個變量用於臨時保存時間的秒、分、時。
int m_Sec, m_Min, m_Hour;
插入后的效果如下:
2.手動添加一個消息映射函數,完成時間的獲取和指針的繪制。
在CClockDlg類的頭文件中找到如下代碼:
在其中增加一行如下:
afx_msg void OnTimer(UINT nIDEvent);
增加后顯示效果如下:
接着在資源管理器中找到CClockDlg類的cpp文件來實現剛才的函數聲明
需要添加的代碼如下:
1 void CClockDlg::OnTimer(UINT nIDEvent) 2 { 3 // TODO: Add your message handler code here and/or call default 4 CTime time = CTime::GetCurrentTime(); //獲得系統時間 5 m_Sec = time.GetSecond(); 6 m_Min = time.GetMinute(); 7 m_Hour = time.GetHour(); 8 9 CDC* pDC = GetDC(); 10 CRect rect; 11 GetClientRect(&rect); //獲取客戶區域 12 CBitmap bitmap; //定義圖片類 13 bitmap.LoadBitmap(IDB_BITMAP1); //加載位圖 14 CDC memdc; //定義臨時畫布 15 memdc.CreateCompatibleDC(pDC); //創建畫布 16 memdc.SelectObject(&bitmap); //關聯圖片 17 18 int x = rect.Width()/2; 19 int y = rect.Height()/2; 20 21 CPen MinutePen(PS_SOLID,2,RGB(0,0,0)); //設置分針畫筆 22 memdc.SelectObject(&MinutePen); 23 memdc.MoveTo(x,y); 24 //繪制分針 25 memdc.LineTo(x+(long)40*cos(PI/2-2*PI*m_Min/60.0),y-(long)40*sin(PI/2-2*PI*m_Min/60.0)); 26 CPen HourPen(PS_SOLID,3,RGB(0,0,0)); //設置時針畫筆 27 memdc.SelectObject(&HourPen); 28 memdc.MoveTo(x,y); 29 //繪制時針 30 memdc.LineTo(x+(long)30*cos(PI/2-2*PI*(5*m_Hour/60.0+m_Min/12.0/60.0)) 31 ,y-(long)30*sin(PI/2-2*PI*(5*m_Hour/60.0+m_Min/12.0/60.0))); 32 CPen SecondPen(PS_SOLID,1,RGB(255,0,0)); //設置秒針畫筆 33 memdc.SelectObject(&SecondPen); 34 memdc.MoveTo(x,y); 35 memdc.LineTo(x+(long)50*cos(PI/2-2*PI*m_Sec/60.0),y-(long)50*sin(PI/2-2*PI*m_Sec/60.0));//繪制秒針 36 memdc.MoveTo(x,y); 37 memdc.LineTo(x+(long)10*cos(PI/2-2*PI*(m_Sec+30)/60.0),y-(long)10*sin(PI/2-2*PI*(m_Sec+30)/60.0));//繪制秒針 38 SecondPen.DeleteObject(); 39 MinutePen.DeleteObject(); 40 HourPen.DeleteObject(); 41 pDC->BitBlt(0,0,rect.right,rect.bottom,&memdc,0,0,SRCCOPY); //復制圖片 42 memdc.DeleteDC(); //復制臨時畫布到預覽窗口 43 bitmap.DeleteObject(); //刪除圖片 44 ReleaseDC(pDC); 45 CDialog::OnTimer(nIDEvent); 46 }
3.設置時鍾位圖
打開“資源視圖”
在“資源視圖”中添加資源
資源類型選擇“Bitmap",然后選擇”導入”,把實現准備好的BMP文件導入。
可以發現“資源視圖”多了“Bitmap"文件夾,展開該文件夾
IDB_BITMAP1即為該資源的ID,用於唯一標識。
4.在資源管理器中打開CClockDlg.cpp,找到函數OnInitDialog的實現。並在
增加一行代碼完成鍾表指針的初始化
SetTimer(1,1,NULL);
添加后效果如下:
然后在該cpp文件中找到以下代碼:
增加一行代碼:
ON_WM_ONTIMER()
添加后顯示效果如下:
最后在CClockDlg.cpp中增加頭文件“math.h"和定義常量PI
四、調整對話框
打開“資源視圖”,選擇”Dialog"->"IDD_CLOCK_DIALOG"
刪除對話框中的“確定”、“取消”、“TODO:再次防止對話框控件”
調整對話框大小,反復運行程序,直至顯示效果合適,表針位於位圖的中心。
如此一來就大功告成啦!(雖然有很多值得改進的地方,比如最后一步。。。)