最近在学习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:再次防⽌对话框控件”
调整对话框⼤⼩,反复运⾏程序,直⾄显⽰效果合适,表针位于位图的中⼼。
如此⼀来就⼤功告成啦!(虽然有很多值得改进的地⽅,⽐如最后⼀步。。。)
因篇幅问题不能全部显示,请点此查看更多更全内容