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:再次防止对话框控件”

调整对话框大小,反复运行程序,直至显示效果合适,表针位于位图的中心。

 

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

posted @ 2014-04-16 11:35  anthozoan77  阅读(5673)  评论(0编辑  收藏  举报