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:再次防止对话框控件”
调整对话框大小,反复运行程序,直至显示效果合适,表针位于位图的中心。
如此一来就大功告成啦!(虽然有很多值得改进的地方,比如最后一步。。。)