MFC之模擬時鍾


最近在學習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:再次防止對話框控件”

調整對話框大小,反復運行程序,直至顯示效果合適,表針位於位圖的中心。

 

如此一來就大功告成啦!(雖然有很多值得改進的地方,比如最后一步。。。)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM