您的当前位置:首页正文

MFC之模拟时钟

来源:个人技术集锦
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:再次防⽌对话框控件”

调整对话框⼤⼩,反复运⾏程序,直⾄显⽰效果合适,表针位于位图的中⼼。

如此⼀来就⼤功告成啦!(虽然有很多值得改进的地⽅,⽐如最后⼀步。。。)

因篇幅问题不能全部显示,请点此查看更多更全内容