您好,欢迎访问三七文档
试验三面向对象程序设计实验——一个简单的可复用时钟控件本实验的开发环境使用C++语言实现使用VC++6.0集成开发环境开发使用MFC应用程序开发框架MFC版本简介MFC全称MicrosoftFoundationClasses.1989年微软公司成立ApplicationFramework技术团队,开发C++面向对象工具给Windows应用程序开发人员使用。这个小组即AFX小组,就是他们,开始了MFC的开发历程。微软公司于1992年4月推出C/C++7.0产品时,初次向世人介绍了MFC1.0,其32位版本也在1992年7月随着Win32SDK推出。VisualC++1.0(也就是C/C++8.0)搭配MFC2.0于1993年3月推出。同年8月推出在WindowsNT上的VisualC++1.1forWindowsNT,搭配的是MFC2.1。微软在1993年12月又推出了16为的VisualC++1.5,搭配的是MFC2.5。1994年9月,微软推出VisualC++2.0,搭配MFC3.0。1995年1月,微软推在增加了MAPI和WinSock支持的基础上,推出MFC3.1。1995年7月,MFC有了3.2版,这是一个小的改版。然后就是1995年9月的32位版MFC4.0。这个版本有了相当大的改进。1996年上半年又有了MFC4.1……时至今日MFC在VisualC++7.0中已经到了7.0版本。我们常用的VisualC++6.0使用的是MFC4.2版本。微软正不断地为“为什么要使用MFC”加上各式各样地强烈你有,并强烈导引它成为Windows程序设计的C++标准界面。正如我们所看到的,越来越多的MFC程序出现了并继续在产生。试验设计目标完成一个可重用的C++类,可以通过该类实现一个简单的模拟时钟编写一个简单的MFC程序测试验证这个时钟控件类关于这个时钟控件,如果按照课件继续完善下去,请将他做得更好更强大。比如说:可以考虑为时钟控件的各项设置(如颜色)提供外部接口,供CClockEx的使用者调用,可以考虑丰富背景绘制,加入背景图片设置,在刻度上标上数字,为指针加上阴影效果,在时钟上显示日期等。有兴趣的同学有空不妨试试。应用程序框架设计过程(仅供参考)打开VC++6.0,新建一个MFC工程,输入工程名,选择“MFCAppWizard”如图所示,然后点击OK。为简单起见,这里选择“Dialogbased”程序,然后可以直接选择finish了。在类视图的工程名上右键单击,选择NewClass(如下图所示)来建立一个新类。我们可以从CStatic类(静态控件类)派生出类CClockEx来实现时钟控件类,这样,就可以继承MFC静态控件的很多已经具备的功能和特点。在建立新类的对话框中,按下图输入。按Ctrl+W调出ClassWizard,在classname中选择刚才建立的新类CClockEx,然后重载虚函数PreSubClassWindow,对时钟控件的基本初始化工作将在该函数中进行。添加消息响应WM_PAINT,我们必须用自己完成时钟的绘制工作。添加消息响应WM_SIZE,重载该消息响应以便我们的时钟控件能够自动适应其大小的变化。为了时钟能够走动,我们得定时刷新时钟控件让它走动,还得添加WM_TIMER的消息响应。最终效果如下图所示。到目前为止,时钟控件的轮廓和已经有了,下面考虑时钟绘制的具体实现。一个时钟大致可由时钟背景、时针、分针、秒针四个部分构成。以上的时钟四个部分可是看作四个不同的对象,可以考虑建立类CClockBackground(背景)CClockHourHand(时针)、CClockMinHand(分针)、CClockSecHand(秒针)来分别实现。(此处为了意义明确,类名都比较长)这四个类有它们的共同点,譬如都有自己的绘图函数,如果要具体能够设置颜色,它们都应该有自己的绘图颜色,同样应该有颜色设置函数,此外都有绘图区域和区域设置函数等等。因此,可以为它们的共性建立一个基类,此处命名为CClockElement(时钟元素)。下面逐步实现各个类,首先实现各个组成类的基类——CClockElement。同样,在ClassView的工程名上面点右键,选择NewClass,在ClassType里面选择GenenricClass,类CClockElement不需要从其它类派生,所以BaseClass可以不填,效果如下图所示。下面对类CClockElement的源代码进行编写。因为在后面的绘图中需要用到sin和cos这两个数学计算公式,因此需包含头文件MATH.H以便使用数学函数库。为后面计算使用,还需定义数学常量PI(3.1415926535)。时钟的每个组成部分都有绘图区域区域,因此,可在基类中定义绘图区域变量。同理,可以定义颜色变量,为了是颜色不显得单调,这里为每个控件设置两种颜色(如果想使程序更加绚丽,可以设置更多颜色)。对应的,这些变量需增加接口函数来进行访问。对于每个组成部分都应该有的Draw函数,当然也需在基类中定义,但是,该函数对于基类来说是无需函数实现的,因此可定义为纯虚函数。综合刚才这几点,CClockElement的实现的头文件代码如下:#includeMATH.H#definePI3.1415926535classCClockElement{public:voidSetColor(COLORREFcrMain,COLORREFcrOther);//设置颜色voidSetTime(constCTime&tmCur);//设置当前时间voidSetRegion(LPRECTlprcRect);//设置绘图区域virtualvoidDraw(CDC*pDC)=0;//绘图函数CClockElement();virtual~CClockElement();protected:COLORREFm_crMain;//主要颜色COLORREFm_crOther;//辅助的其他颜色CTimem_tmCur;//当前时刻CRectm_rcRegion;//绘图区域intm_nRadius;//时钟半径CClockElement的实现的源文件关键代码如下:CClockElement::CClockElement(){m_nRadius=0;m_crMain=RGB(255,255,255);m_crOther=RGB(128,128,128);}CClockElement::~CClockElement(){}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;}下面实现时钟背景类——CClockBackground。同样,在ClassView的工程名上面点右键,选择NewClass,在ClassType里面选择GenenricClass,类CClockBackground需要从类CClockElement派生,所以BaseClass需选择类CClockElement,效果如下图所示。CClockBackground只需实现基类的虚函数Draw即可,因此这里重载基类的虚函数Draw,其头文件实现代码如下:#includeClockElement.hclassCClockBackground:publicCClockElement{public:CClockBackground();virtual~CClockBackground();};CClockBackground源文件代码如下:CClockBackground::CClockBackground(){//为时钟背景定义默认的颜色设置m_crMain=RGB(0,255,0);m_crOther=RGB(0,128,0);}CClockBackground::~CClockBackground(){}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);CClockBackground源文件代码如下(续上页)://绘制60个小圆点,表示分针和秒针的刻度CPointptCenter=m_rcRegion.CenterPoint();intnRadius=m_nRadius-8;for(inti=0;i60;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;i12;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);}//还原设备环境pDC-SelectObject(pOldPen);pDC-SelectObject(pOldBrush);}下面实现时针类CClockHourHand,该类新建的过程与CClockBackground一样,CClockHourHand同样只需实现基类的虚函数Draw即可,其头文件实现代码如下:#includeClockElement.hclassCClockHourHand:publicCClockElement{public:CClockHourHand();virtual~CClockHourHand();virtualvoidDraw(CDC*pDC);};CClockHourHand源文件代码如下:CClockHourHand::CClockHourHand(){//定义默认颜色m_crMain=RGB(0,255,100);m_crOther=RGB(128,128,0);}CClockHourHand::~CClockHourHand(){}voidCClockHourHand::Draw(CDC*pDC){//初始化设备环境CPenpenMain(PS_SOLID,1,m_crMain),penOther(PS_SOLID,1,m_crOther);CBrushbrMain(m_crM
本文标题:mfc时钟制作实例
链接地址:https://www.777doc.com/doc-3970410 .html