VC++课程设计基于MFC的模拟时钟.docx
《VC++课程设计基于MFC的模拟时钟.docx》由会员分享,可在线阅读,更多相关《VC++课程设计基于MFC的模拟时钟.docx(12页珍藏版)》请在冰豆网上搜索。
VC++课程设计基于MFC的模拟时钟
VC++课程设计--基于MFC的模拟时钟
计科2011级
VC++课程设计实验报告
题目:
基于MFC的模拟时钟
班级:
计科1104班
学号:
1108030429
姓名:
张宝龙
日期:
2014/1/7
课程设计实验报告
1、题目:
基于MFC的模拟时钟
2、编程要点:
制作时钟的过程中,首先给时钟创建一个基类CClockElement,还需要派生类CClockBackground,CClockHourHand,CClockMinHand,CClockSecHand分别控制时钟的背景,时钟的时针,分针,秒针。
3、实现过程:
(1)工程、风格、控件与变量表
本时钟是基本对话框的时钟,界面简约,便于使用。
控件
控件名
控件类型
Clock
静态文本
变量表
变量名
类型
m_crMain
COLORREF
m_crOther
COLORREF
m_tmCur
CTime
m_rcRegion
CRect
m_nRadius
int
m_clockBK
CClockBackground
m_clockHour
CClockHourHand
m_clockMin
CClockMinHand
m_clockSec
CClockSecHand
m_rcClient
CRect
m_Clock
CClockEX
(2)主要功能程序代码
CClockBackground:
:
CClockBackground()
{
//为时钟背景定义默认的颜色设置
m_crMain=RGB(0,0,255);
m_crOther=RGB(0,255,0);
}
voidCClockBackground:
:
Draw(CDC*pDC)
{
//设置准备环境
CPenpenMain(PS_SOLID,1,m_crMain),penOther(PS_SOLID,1,m_crOther);
CBrushbrMain(m_crMain),brOther(m_crOther);
CPen*pOldPen=pDC->SelectObject(&penOther);
CBrush*pOldBrush=pDC->SelectObject(&brMain);
CPointptCenter=m_rcRegion.CenterPoint();
intnRadius=m_nRadius-8;
for(inti=0;i<60;i++)
{
CPointptEnd=ptCenter;
ptEnd.Offset((int)(nRadius*sin(2*PI*(i%60)/60)),(int)(-nRadius*cos(2*PI*(i%60)/60)));
CRectrcDot(-2,-2,2,2);
rcDot.OffsetRect(ptEnd);
pDC->Ellipse(rcDot);
}
//绘制12个小方框,表示12个正点
pDC->SelectObject(&penMain);
pOldBrush=pDC->SelectObject(&brOther);
for(i=0;i<12;i++)
{
CPointptEnd=ptCenter;
doublefRadian=2*PI*(i%12)/12;
ptEnd.Offset((int)(nRadius*sin(fRadian)),(int)(-nRadius*cos(fRadian)));
CRectrcDot(-3,-3,3,3);
rcDot.OffsetRect(ptEnd);
pDC->Rectangle(rcDot);
}
//huanyuan设备环境
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
CClockHourHand:
:
CClockHourHand()
{
//定义默认颜色
m_crMain=RGB(0,0,128);
m_crOther=RGB(128,128,0);
}
voidCClockHourHand:
:
Draw(CDC*pDC)
{
//设置准备环境
CPenpenMain(PS_SOLID,1,m_crMain),penOther(PS_SOLID,1,m_crOther);
CBrushbrMain(m_crMain),brOther(m_crOther);
CPen*pOldPen=pDC->SelectObject(&penOther);
CBrush*pOldBrush=pDC->SelectObject(&brMain);
//确定当前指针的弧度
intnTime=(m_tmCur.GetHour()%12)*3600;
nTime+=m_tmCur.GetMinute()*60;
nTime+=m_tmCur.GetSecond();
doublefRadian=2*PI*nTime/3600/12;
//确定绘制菱形指针所需的四个角的坐标
CPointptDiamond[4];
for(inti=0;i<4;i++)
{
ptDiamond[i]=m_rcRegion.CenterPoint();
}
intnRadius=m_nRadius/2;
ptDiamond[0].Offset((int)(nRadius*sin(fRadian)),(int)(-nRadius*cos(fRadian)));
fRadian+=0.5*PI;
nRadius=m_nRadius/20;
ptDiamond[1].Offset((int)(nRadius*sin(fRadian)),(int)(-nRadius*cos(fRadian)));
fRadian+=0.5*PI;
nRadius=m_nRadius/10;
ptDiamond[2].Offset((int)(nRadius*sin(fRadian)),(int)(-nRadius*cos(fRadian)));
fRadian+=0.5*PI;
nRadius=m_nRadius/20;
ptDiamond[3].Offset((int)(nRadius*sin(fRadian)),(int)(-nRadius*cos(fRadian)));
//绘制菱形时钟
pDC->Polygon(ptDiamond,4);
//huanyuan设备环境
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
CClockMinHand:
:
CClockMinHand()
{
//定义默认颜色
m_crMain=RGB(0,255,100);
m_crOther=RGB(128,128,0);
}
voidCClockMinHand:
:
Draw(CDC*pDC)
{
//设置准备环境
CPenpenMain(PS_SOLID,1,m_crMain),penOther(PS_SOLID,1,m_crOther);
CBrushbrMain(m_crMain),brOther(m_crOther);
CPen*pOldPen=pDC->SelectObject(&penOther);
CBrush*pOldBrush=pDC->SelectObject(&brMain);
//确定分针所在位置的弧度
intnTime=m_tmCur.GetMinute()*60;
nTime+=m_tmCur.GetSecond();
doublefRadian=2*PI*nTime/3600;
//确定绘制菱形指针所需的四个角的坐标
CPointptDiamond[4];
for(inti=0;i<4;i++)
{
ptDiamond[i]=m_rcRegion.CenterPoint();
}
intnRadius=m_nRadius/4;
ptDiamond[0].Offset((int)(nRadius*sin(fRadian)),(int)(-nRadius*cos(fRadian)));
fRadian+=0.5*PI;
nRadius=m_nRadius/20;
ptDiamond[1].Offset((int)(nRadius*sin(fRadian)),(int)(-nRadius*cos(fRadian)));
fRadian+=0.5*PI;
nRadius=m_nRadius/10;
ptDiamond[2].Offset((int)(nRadius*sin(fRadian)),(int)(-nRadius*cos(fRadian)));
fRadian+=0.5*PI;
nRadius=m_nRadius/20;
ptDiamond[3].Offset((int)(nRadius*sin(fRadian)),(int)(-nRadius*cos(fRadian)));
//绘制菱形时钟
pDC->Polygon(ptDiamond,4);
//huanyuan设备环境
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
CClockSecHand:
:
CClockSecHand()
{
//设定秒针的默认颜色
m_crMain=RGB(0,200,200);
m_crOther=RGB(0,200,200);
}
voidCClockSecHand:
:
Draw(CDC*pDC)
{
intnTime=m_tmCur.GetSecond();
CPointptStart=m_rcRegion.CenterPoint();
CPointptEnd=ptStart;
intnRadius=m_nRadius-10;
ptEnd.Offset((int)(nRadius*sin(2*PI*nTime/60)),(int)(-nRadius*cos(2*PI*nTime/60)));
CPenpenMain(PS_SOLID,1,m_crMain);
CPen*pOldPen=pDC->SelectObject(&penMain);
pDC->MoveTo(ptStart);
pDC->LineTo(ptEnd);
pDC->SelectObject(pOldPen);
}
voidCClockEX:
:
OnTimer(UINTnIDEvent)
{
Invalidate(FALSE);
CStatic:
:
OnTimer(nIDEvent);
}
voidCClockEX:
:
OnSize(UINTnType,intcx,intcy)
{
CStatic:
:
OnSize(nType,cx,cy);
GetClientRect(m_rcClient);//获取当前客户区
m_clockBK.SetRegion(m_rcClient);
m_clockHour.SetRegion(m_rcClient);
m_clockMin.SetRegion(m_rcClient);
m_clockSec.SetRegion(m_rcClient);
}
voidCClockEX:
:
OnPaint()
{
CPaintDCdc(this);//devicecontextforpainting
//实现双缓冲绘图---防止屏幕闪烁
CDCdcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmapbmp;
bmp.CreateCompatibleBitmap(&dc,m_rcClient.Width(),m_rcClient.Height());
dcMem.SelectObject(&bmp);
DrawClock(&dcMem);//绘制时钟
dc.BitBlt(0,0,m_rcClient.Width(),m_rcClient.Height(),&dcMem,0,0,SRCCOPY);
}
voidCClockEX:
:
PreSubclassWindow()
{
GetClientRect(m_rcClient);//获取当前客户区
m_clockBK.SetRegion(m_rcClient);
m_clockHour.SetRegion(m_rcClient);
m_clockMin.SetRegion(m_rcClient);
m_clockSec.SetRegion(m_rcClient);
SetTimer(1,100,NULL);
CStatic:
:
PreSubclassWindow();
}
voidCClockEX:
:
DrawClock(CDC*pDC)
{
CTimetmCur=CTime:
:
GetCurrentTime();
m_clockBK.SetTime(tmCur);
m_clockHour.SetTime(tmCur);
m_clockMin.SetTime(tmCur);
m_clockSec.SetTime(tmCur);
m_clockBK.Draw(pDC);
m_clockHour.Draw(pDC);
m_clockMin.Draw(pDC);
m_clockSec.Draw(pDC);
}
CClockElement:
:
CClockElement()
{
m_nRadius=0;
m_crMain=RGB(255,0,0);
m_crOther=RGB(128,128,0);
}
voidCClockElement:
:
SetRegion(LPRECTlprcRect)
{
m_rcRegion=lprcRect;
m_nRadius=m_rcRegion.Width()/2;
if(m_rcRegion.Width()>m_rcRegion.Height())
{
m_nRadius=m_rcRegion.Height()/2;
}
}
voidCClockElement:
:
SetTime(constCTime&tmCur)
{
m_tmCur=tmCur;
}
voidCClockElement:
:
SetColor(COLORREFcrMain,COLORREFcrOther)
{
m_crMain=crMain;
m_crOther=crOther;
}
4、运行效果展示:
5、自我总结:
该小程序是基于MFC中的对话框的,主要针对画笔和画刷的用法,没有涉及连接数据库和算法,完全是为了本学期所学知识的运用,由于时间紧,所以没能深入的探索MFC的奥妙,不过通过本次设计,我对老师课堂上所讲述的关于该类型的知识,有了进一步的了解和掌握,初步的熟悉了画笔和画刷的简单用法,还巩固了MFC类中的基本操作,例如,添加新类,新变量,创建新的对话框,添加控件等方面的知识。
程序设计过程中最大的困难就是对于MFC中的函数了解不够,不能融会贯通的拿来运用,通过XX搜索引擎的查询给自己提供了很大的帮助。
通过此次课程设计使我深刻了解到了日常知识积累的重要性。
同时通过此次课程设计,对于设计可视化窗口的程序有了更好的了解,也激发了自己对可视化窗口程序设计的兴趣。
而且通过这次课程设计,使自己对课本上的东西有了更好的掌握,对课程内容的了解更加深刻,受益匪浅。
通过本次设计我更加懂得了想要熟练掌握编程语言,就需要我们勤于练习。