版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 试验三面向对象程序设计实验一个简单的可复用时钟控件本实验的开发环境n使用C语言实现n使用VC6.0集成开发环境开发n使用MFC应用程序开发框架MFC版本简介nMFC全称Microsoft Foundation Classes.n1989年微软公司成立Application Framework技术团队,开发C面向对象工具给Windows应用程序开发人员使用。这个小组即AFX小组,就是他们,开始了MFC的开发历程。n微软公司于1992年4月推出C/C+7.0产品时,初次向世人介绍了MFC 1.0,其32位版本也在1992年7月随着Win32 SDK推出。nVisual C1.0(也就是C/C+8
2、.0)搭配MFC 2.0于1993年3月推出。同年8月推出在Windows NT上的Visual C1.1 for Windows NT,搭配的是MFC 2.1。n微软在微软在19931993年年1212月又推出了月又推出了1616为的为的Visual C+ 1.5, Visual C+ 1.5, 搭配搭配的是的是MFC 2.5MFC 2.5。n19941994年年9 9月,微软推出月,微软推出Visual CVisual C 2.02.0,搭配,搭配MFC 3.0MFC 3.0。n19951995年年1 1月,微软推在增加了月,微软推在增加了MAPIMAPI和和WinSockWinSock支
3、持的基础上,支持的基础上,推出推出MFC 3.1MFC 3.1。n19951995年年7 7月,月,MFCMFC有了有了3.23.2版,这是一个小的改版。版,这是一个小的改版。n然后就是然后就是19951995年年9 9月的月的3232位版位版MFC 4.0MFC 4.0。这个版本有了相当。这个版本有了相当大的改进。大的改进。n19961996年上半年又有了年上半年又有了MFC4.1MFC4.1n时至今日时至今日MFCMFC在在Visual CVisual C 7.07.0中已经到了中已经到了7.07.0版本。版本。n我们常用的我们常用的Visual CVisual C6.06.0使用的是使用
4、的是MFC 4.2MFC 4.2版本。版本。n微软正不断地为微软正不断地为“为什么要使用为什么要使用MFC”MFC”加上各式各样地强加上各式各样地强烈你有,并强烈导引它成为烈你有,并强烈导引它成为WindowsWindows程序设计的程序设计的C C标准标准界面。正如我们所看到的,越来越多的界面。正如我们所看到的,越来越多的MFCMFC程序出现了并程序出现了并继续在产生。继续在产生。试验设计目标n完成一个可重用的完成一个可重用的C类,可以通过该类实现一个简类,可以通过该类实现一个简单的模拟时钟单的模拟时钟n编写一个简单的编写一个简单的MFC程序测试验证这个时钟控件类程序测试验证这个时钟控件类n
5、关于这个时钟控件,如果按照课件继续完善下去,请关于这个时钟控件,如果按照课件继续完善下去,请将他做得更好更强大。比如说:可以考虑为时钟控件将他做得更好更强大。比如说:可以考虑为时钟控件的各项设置(如颜色)提供外部接口,供的各项设置(如颜色)提供外部接口,供CClockEx的的使用者调用,可以考虑丰富背景绘制,加入背景图片使用者调用,可以考虑丰富背景绘制,加入背景图片设置,在刻度上标上数字,为指针加上阴影效果,在设置,在刻度上标上数字,为指针加上阴影效果,在时钟上显示日期等。有兴趣的同学有空不妨试试时钟上显示日期等。有兴趣的同学有空不妨试试。应用程序框架设计过程(仅供参考)n打开VC6.0,新建
6、一个MFC工程,输入工程名,选择“MFC AppWizard”如图所示,然后点击OK。n为简单起见,这里选择“Dialog based”程序,然后可以直接选择finish了。n在类视图的工程名上右键单击,选择New Class(如下图所示)来建立一个新类。n我们可以从CStatic类(静态控件类)派生出类CClockEx来实现时钟控件类,这样,就可以继承MFC静态控件的很多已经具备的功能和特点。在建立新类的对话框中,按下图输入。n按按CtrlCtrlW W调出调出Class WizardClass Wizard,在,在class nameclass name中选择刚才建立的中选择刚才建立的新类
7、新类CClockExCClockEx,然后,然后重载虚函数重载虚函数PreSubClassWindowPreSubClassWindow,对时钟控件的基本初始化工作,对时钟控件的基本初始化工作将在该函数中进行。将在该函数中进行。添加消息响应添加消息响应WM_PAINTWM_PAINT,我们必须用自己完成时钟的绘制工作。,我们必须用自己完成时钟的绘制工作。添加消息响应添加消息响应WM_SIZEWM_SIZE,重载该消息响应以便我们的时钟控件能,重载该消息响应以便我们的时钟控件能够自动适应其大小的变化。够自动适应其大小的变化。为了时钟能够走动,我们得定时刷新时钟控件让它走动,还得为了时钟能够走动,
8、我们得定时刷新时钟控件让它走动,还得添加添加WM_TIMERWM_TIMER的消息响应。最终效果如下图所示。的消息响应。最终效果如下图所示。n到目前为止,时钟控件的轮廓和已经有了,下面考到目前为止,时钟控件的轮廓和已经有了,下面考虑时钟绘制的具体实现。虑时钟绘制的具体实现。一个时钟大致可由时钟背景、时针、分针、秒针四一个时钟大致可由时钟背景、时针、分针、秒针四个部分构成。个部分构成。以上的时钟四个部分可是看作四个不同的对象,可以上的时钟四个部分可是看作四个不同的对象,可以考虑建立类以考虑建立类CClockBackgroundCClockBackground、CClockHourHandCClo
9、ckHourHand、CClockMinHandCClockMinHand、CClockSecHandCClockSecHand来分别实现。(此来分别实现。(此处为了意义明确,类名都比较长)处为了意义明确,类名都比较长)这四个类有它们的共同点,譬如都有自己的绘图函这四个类有它们的共同点,譬如都有自己的绘图函数,如果要具体能够设置颜色,它们都应该有自己数,如果要具体能够设置颜色,它们都应该有自己的绘图颜色,同样应该有颜色设置函数,此外都有的绘图颜色,同样应该有颜色设置函数,此外都有绘图区域和区域设置函数等等。因此,可以为它们绘图区域和区域设置函数等等。因此,可以为它们的共性建立一个基类,此处命名
10、为的共性建立一个基类,此处命名为CClockElementCClockElement。n下面逐步实现各个类,首先实现各个组成类的基类下面逐步实现各个类,首先实现各个组成类的基类CClockElement。同样,在。同样,在ClassView的工程名上面点右的工程名上面点右键,选择键,选择New Class,在,在ClassType里面选择里面选择Genenric Class,类,类CClockElement不需要从其它类派生,所以不需要从其它类派生,所以Base Class可以不填,效果如下图所示。可以不填,效果如下图所示。n下面对类CClockElement的源代码进行编写。因为在后面的绘图
11、中需要用到因为在后面的绘图中需要用到sinsin和和coscos这两个数这两个数学计算公式,因此需包含头文件学计算公式,因此需包含头文件以便使以便使用数学函数库。为后面计算使用,还需定义数学用数学函数库。为后面计算使用,还需定义数学常量常量PIPI(31415926535)。)。时钟的每个组成部分都有绘图区域区域,因此,时钟的每个组成部分都有绘图区域区域,因此,可在基类中定义绘图区域变量。同理,可以定义可在基类中定义绘图区域变量。同理,可以定义颜色变量,为了是颜色不显得单调,这里为每个颜色变量,为了是颜色不显得单调,这里为每个控件设置两种颜色(如果想使程序更加绚丽,可
12、控件设置两种颜色(如果想使程序更加绚丽,可以设置更多颜色)。以设置更多颜色)。对应的,这些变量需增加接口函数来进行访问。对应的,这些变量需增加接口函数来进行访问。对于每个组成部分都应该有的对于每个组成部分都应该有的DrawDraw函数,当然也函数,当然也需在基类中定义,但是,该函数对于基类来说是需在基类中定义,但是,该函数对于基类来说是无需函数实现的,因此可定义为纯虚函数。无需函数实现的,因此可定义为纯虚函数。n综合刚才这几点,综合刚才这几点,CClockElementCClockElement的实现的头文件代码如下的实现的头文件代码如下:#include #define PI 3.14159
13、26535class CClockElement public:void SetColor(COLORREF crMain, COLORREF crOther);/设置颜色void SetTime(const CTime &tmCur);/设置当前时间void SetRegion(LPRECT lprcRect);/设置绘图区域virtual void Draw(CDC *pDC) = 0;/绘图函数CClockElement();virtual CClockElement();protected:COLORREFm_crMain;/主要颜色COLORREFm_crOther;/辅助的
14、其他颜色CTimem_tmCur;/当前时刻CRectm_rcRegion;/绘图区域intm_nRadius;/时钟半径nCClockElement的实现的源文件关键代码如下:的实现的源文件关键代码如下:CClockElement:CClockElement()m_nRadius = 0;m_crMain = RGB(255, 255, 255);m_crOther = RGB(128, 128, 128);CClockElement:CClockElement()void CClockElement:SetRegion(LPRECT lprcRect)m_rcRegion = lprcRe
15、ct;m_nRadius = m_rcRegion.Width() / 2;if (m_rcRegion.Width() m_rcRegion.Height()m_nRadius = m_rcRegion.Height() / 2;n续上页:void CClockElement:SetTime(const CTime &tmCur)m_tmCur = tmCur;void CClockElement:SetColor(COLORREF crMain, COLORREF crOther)m_crMain = crMain;m_crOther = crOther;n下面实现时钟背景类CCl
16、ockBackground。同样,在ClassView的工程名上面点右键,选择New Class,在ClassType里面选择Genenric Class,类CClockBackground需要从类CClockElement派生,所以Base Class需选择类CClockElement,效果如下图所示。nCClockBackground只需实现基类的虚函数Draw即可,因此这里重载基类的虚函数Draw,其头文件实现代码如下:#include ClockElement.hclass CClockBackground : public CClockElement public:CClockBac
17、kground();virtual CClockBackground();nCClockBackground源文件代码如下:CClockBackground:CClockBackground()/为时钟背景定义默认的颜色设置m_crMain = RGB(0, 255, 0);m_crOther = RGB(0, 128, 0);CClockBackground:CClockBackground()void CClockBackground:Draw(CDC *pDC)/准备设备环境CPen penMain(PS_SOLID, 1, m_crMain), penOther(PS_SOLID, 1
18、, m_crOther);CBrush brMain(m_crMain), brOther(m_crOther);CPen *pOldPen = pDC-SelectObject(&penOther);CBrush *pOldBrush = pDC-SelectObject(&brMain);nCClockBackgroundCClockBackground源文件代码如下(续上页):源文件代码如下(续上页):n/绘制绘制6060个小圆点,表示分针和秒针的刻度个小圆点,表示分针和秒针的刻度CPoint ptCenter = m_rcRegion.CenterPoint();int
19、 nRadius = m_nRadius - 8;for(int i=0; iEllipse(rcDot);/绘制绘制12个小方框,表示个小方框,表示12个正点个正点pDC-SelectObject(&penMain);pOldBrush = pDC-SelectObject(&brOther);for(i=0; iRectangle(rcDot);/还原设备环境还原设备环境pDC-SelectObject(pOldPen);pDC-SelectObject(pOldBrush);n下面实现时针类CClockHourHand,该类新建的过程与CClockBackground一样
20、, CClockHourHand同样只需实现基类的虚函数Draw即可,其头文件实现代码如下:#include ClockElement.hclass CClockHourHand : public CClockElement public:CClockHourHand();virtual CClockHourHand();virtual void Draw(CDC *pDC);nCClockHourHandCClockHourHand源文件代码如下:源文件代码如下:CClockHourHand:CClockHourHand()/定义默认颜色定义默认颜色m_crMain = RGB(0, 255
21、, 100);m_crOther = RGB(128, 128, 0);CClockHourHand:CClockHourHand()void CClockHourHand:Draw(CDC *pDC)/初始化设备环境初始化设备环境CPen penMain(PS_SOLID, 1, m_crMain), penOther(PS_SOLID, 1, m_crOther);CBrush brMain(m_crMain), brOther(m_crOther);CPen *pOldPen = pDC-SelectObject(&penOther);CBrush *pOldBrush = pD
22、C-SelectObject(&brMain);/确定当前指针的弧度确定当前指针的弧度int nTime = (m_tmCur.GetHour() % 12) * 3600;nTime += m_tmCur.GetMinute() * 60;nTime += m_tmCur.GetSecond();double fRadian = 2 * PI * nTime / 3600 / 12; nCClockHourHand源文件代码如下(续上页):/确定绘制菱形指针所需的四个角的坐标确定绘制菱形指针所需的四个角的坐标CPoint ptDiamond4;for(int i=0; iPolygo
23、n(ptDiamond, 4);/恢复设备环境恢复设备环境pDC-SelectObject(pOldPen);pDC-SelectObject(pOldBrush);n下面实现分针类CClockMinHand,该类新建的过程与CClockHourHand一样,类的实现也基本相似,其头文件实现代码如下:#include ClockElement.hclass CClockMinHand : public CClockElement public:CClockMinHand();virtual CClockMinHand();virtual void Draw(CDC *pDC);nCClockM
24、inHandCClockMinHand源文件代码如下:源文件代码如下:CClockMinHand:CClockMinHand()/定义默认颜色定义默认颜色m_crMain = RGB(0, 255, 100);m_crOther = RGB(128, 128, 0);CClockMinHand:CClockMinHand()void CClockMinHand:Draw(CDC *pDC)/初始化设备环境初始化设备环境CPen penMain(PS_SOLID, 1, m_crMain), penOther(PS_SOLID, 1, m_crOther);CBrush brMain(m_crM
25、ain), brOther(m_crOther);CPen *pOldPen = pDC-SelectObject(&penOther);CBrush *pOldBrush = pDC-SelectObject(&brMain);/确定分针所在位置的弧度确定分针所在位置的弧度int nTime = m_tmCur.GetMinute() * 60;nTime += m_tmCur.GetSecond();double fRadian = 2 * PI * nTime / 3600;nCClockMinHand源文件代码如下(续上页):源文件代码如下(续上页):/确定绘制菱形指针
26、所需的四个角的坐标确定绘制菱形指针所需的四个角的坐标CPoint ptDiamond4;for(int i=0; iPolygon(ptDiamond, 4);/恢复设备环境恢复设备环境pDC-SelectObject(pOldPen);pDC-SelectObject(pOldBrush);n下面实现秒针类CClockSecHand,该类新建的过程与CClockHourHand一样,类的实现也基本相似,其头文件实现代码如下:#include ClockElement.hclass CClockSecHand : public CClockElement public:CClockSecHan
27、d();virtual CClockSecHand();virtual void Draw(CDC *pDC);nCClockSecHandCClockSecHand源文件代码如下:源文件代码如下:CClockSecHand:CClockSecHand()/设定秒针的默认颜色设定秒针的默认颜色m_crMain = RGB(0, 200, 200);m_crOther = RGB(0, 200, 200);CClockSecHand:CClockSecHand()void CClockSecHand:Draw(CDC *pDC)int nTime = m_tmCur.GetSecond();CP
28、oint ptStart = m_rcRegion.CenterPoint();CPoint ptEnd = ptStart;int nRadius = m_nRadius - 10;ptEnd.Offset(int)(nRadius * sin(2 * PI * nTime / 60), (int)(-nRadius * cos(2 * PI * nTime / 60);CPen penMain(PS_SOLID, 1, m_crMain);CPen *pOldPen = pDC-SelectObject(&penMain);pDC-MoveTo(ptStart);pDC-LineT
29、o(ptEnd);pDC-SelectObject(pOldPen);n到目前为止,时钟的各个部件都已经设计完毕,现在该把它们组装起来到目前为止,时钟的各个部件都已经设计完毕,现在该把它们组装起来了。了。刚才建立的四个类刚才建立的四个类CClockBackground、CClockHourHand、CClockMinHand、CClockSecHand要为要为CClockEx服务,正如服务,正如CClockElement为它们服务一样,不过服务的方式发生了变化,刚才是为它们服务一样,不过服务的方式发生了变化,刚才是以继承的方式使用,现在需要将上面四个类实例化供以继承的方式使用,现在需要将上面四
30、个类实例化供CClockEx使用。使用。因此,首先应该在类因此,首先应该在类CClockEx为上四个类分别建立对象。在为上四个类分别建立对象。在CClockEx的头文件中恰当位置加入以下代码:的头文件中恰当位置加入以下代码:#include ClockBackground.h#include ClockHourHand.h#include ClockMinHand.h#include ClockSecHand.hclass CClockEx : public CStaticprivate:CClockBackgroundm_clockBK;/时钟背景时钟背景CClockHourHandm_cl
31、ockHour; /时指针时指针CClockMinHandm_clockMin;/分指针分指针CClockSecHandm_clockSec;/秒指针秒指针为了存储绘图区域的大小,需要在为了存储绘图区域的大小,需要在CClockExCClockEx中加入一个变量中加入一个变量m_m_rcClientrcClient: CRectCRect m_m_rcClientrcClient; ;/客户区域客户区域在在PreSubclassWindowPreSubclassWindow函数中进行时钟的初始化工作。首先函数中进行时钟的初始化工作。首先得为各个部件设定区域大小,然后启动定时刷新的定时器得为各个
32、部件设定区域大小,然后启动定时刷新的定时器(100100毫秒的定时器已经足够)。由于每个部件都有自己的毫秒的定时器已经足够)。由于每个部件都有自己的默认颜色配置,因此这里暂且先使用默认配置,当然也可以默认颜色配置,因此这里暂且先使用默认配置,当然也可以自定义颜色:自定义颜色:GetClientRectGetClientRect(m_(m_rcClientrcClient); /); /获取当前客户区域获取当前客户区域m_m_clockBKclockBK. .SetRegionSetRegion(m_(m_rcClientrcClient););m_m_clockHourclockHour. .
33、SetRegionSetRegion(m_(m_rcClientrcClient););m_m_clockMinclockMin. .SetRegionSetRegion(m_(m_rcClientrcClient););m_m_clockSecclockSec. .SetRegionSetRegion(m_(m_rcClientrcClient););SetTimer(1, 100, NULL);SetTimer(1, 100, NULL); / /每每100100毫秒刷新一次毫秒刷新一次当控件大小发生变化时,控件状态要能够自动更新:当控件大小发生变化时,控件状态要能够自动更新:void C
34、ClockEx:OnSize(UINT nType, int cx, int cy) 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);每个定时器时间触发时,需要刷新控件以保证时钟的走动:每个定时器时间触发时,需要刷新控件以保证时钟的走动:void CClockEx:OnT
35、imer(UINT nIDEvent) Invalidate(FALSE);CStatic:OnTimer(nIDEvent);下面实现时钟的绘制,由于控件在不断刷新,按一般方式绘图,屏幕会下面实现时钟的绘制,由于控件在不断刷新,按一般方式绘图,屏幕会不断闪烁,因此此处使用双缓冲绘图不断闪烁,因此此处使用双缓冲绘图就是在内存中绘图,绘制完毕就是在内存中绘图,绘制完毕时在时在CopyCopy到屏幕上,这样可以有效的防止屏幕闪烁:到屏幕上,这样可以有效的防止屏幕闪烁:void CClockEx:OnPaint() CPaintDC dc(this); / device context for pa
36、inting/实现双缓冲绘图实现双缓冲绘图防止屏幕闪烁防止屏幕闪烁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, SR
37、CCOPY);为了程序结构更清晰,我们将绘图函数放在一个单独的函数为了程序结构更清晰,我们将绘图函数放在一个单独的函数DrawClock中,下面室中,下面室DrawClock的函数实现:的函数实现:void CClockEx:DrawClock(CDC *pDC)CTime tmCur = CTime:GetCurrentTime();m_clockBK.SetTime(tmCur);m_clockHour.SetTime(tmCur);m_clockMin.SetTime(tmCur);m_clockSec.SetTime(tmCur);m_clockBK.Draw(pDC);m_clock
38、Min.Draw(pDC);m_clockHour.Draw(pDC);m_clockSec.Draw(pDC);下面是完整的下面是完整的CClockExCClockEx源码:源码:#if !defined(AFX_CLOCKEX_H_EB35C434_A727_43BE_B10E_121F6307EA73_INCLUDED_)#define AFX_CLOCKEX_H_EB35C434_A727_43BE_B10E_121F6307EA73_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000/ ClockEx.h : he
39、ader file/ CClockEx window#include ClockBackground.h#include ClockHourHand.h#include ClockMinHand.h#include ClockSecHand.hclass CClockEx : public CStaticprivate:CRectm_rcClient;/客户区域客户区域CClockBackground m_clockBK;/时钟背景时钟背景CClockHourHandm_clockHour;/时指针时指针CClockMinHandm_clockMin;/分指针分指针CClockSecHandm
40、_clockSec;/秒指针秒指针void DrawClock(CDC *pDC);/ Constructionpublic:CClockEx();下面是完整的下面是完整的CClockExCClockEx源码(续上页):源码(续上页):/ Attributespublic:/ Operationspublic:/ Overrides/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CClockEx)protected:virtual void PreSubclassWindow();/AFX_VIRTUAL/ Impl
41、ementationpublic:virtual CClockEx();/ Generated message map functionsprotected:/AFX_MSG(CClockEx)afx_msg void OnPaint();afx_msg void OnSize(UINT nType, int cx, int cy);afx_msg void OnTimer(UINT nIDEvent);/AFX_MSGDECLARE_MESSAGE_MAP();/AFX_INSERT_LOCATION/ Microsoft Visual C+ will insert additional d
42、eclarations immediately before the previous line.#endif / !defined(AFX_CLOCKEX_H_EB35C434_A727_43BE_B10E_121F6307EA73_INCLUDED_)下面是完整的下面是完整的CClockExCClockEx源码(续上页):源码(续上页):/ ClockEx.cpp : implementation file#include stdafx.h#include ClockProject.h#include ClockEx.h#ifdef _DEBUG#define new DEBUG_NEW#
43、undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CClockExCClockEx:CClockEx()CClockEx:CClockEx()BEGIN_MESSAGE_MAP(CClockEx, CStatic)/AFX_MSG_MAP(CClockEx)ON_WM_SIZE()ON_WM_PAINT()ON_WM_TIMER()/AFX_MSG_MAPEND_MESSAGE_MAP()下面是完整的下面是完整的CClockExCClockEx源码(续上页):源码(续上页):/ / CClockExCClockEx message ha
44、ndlers message handlersvoid void CClockExCClockEx:PreSubclassWindowPreSubclassWindow() () /获取当前客户区域获取当前客户区域GetClientRectGetClientRect(m_(m_rcClientrcClient););m_m_clockBKclockBK. .SetRegionSetRegion(m_(m_rcClientrcClient););m_m_clockHourclockHour. .SetRegionSetRegion(m_(m_rcClientrcClient););m_m_clo
45、ckMinclockMin. .SetRegionSetRegion(m_(m_rcClientrcClient););m_m_clockSecclockSec. .SetRegionSetRegion(m_(m_rcClientrcClient););SetTimer(1, 100, NULL);SetTimer(1, 100, NULL);CStaticCStatic:PreSubclassWindowPreSubclassWindow();(); void void CClockExCClockEx:OnSizeOnSize(UINT (UINT nTypenType, , intint
46、 cxcx, , intint cy) cy) CStaticCStatic:OnSizeOnSize( (nTypenType, , cxcx, cy);, cy);GetClientRectGetClientRect(m_(m_rcClientrcClient););m_m_clockBKclockBK. .SetRegionSetRegion(m_(m_rcClientrcClient););m_m_clockHourclockHour. .SetRegionSetRegion(m_(m_rcClientrcClient););m_m_clockMinclockMin. .SetRegi
47、onSetRegion(m_(m_rcClientrcClient););m_m_clockSecclockSec. .SetRegionSetRegion(m_(m_rcClientrcClient);); 下面是完整的下面是完整的CClockExCClockEx源码(续上页):源码(续上页):void void CClockExCClockEx:OnPaintOnPaint() () CPaintDCCPaintDC dc(this); / device context for painting dc(this); / device context for painting/实现双缓冲绘图实现双缓冲绘图防止屏幕闪烁防止屏幕闪烁CDCCDCdcMemdcMem; ;dcMemdcMem. .C
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高中地理 第二单元 第2节《气压带和风带》教学设计 新人教版必修1
- 八年级生物上册 第六单元 生物的多样性及其保护 第二章 认识生物的多样性教案 (新版)新人教版
- 2024-2025学年新教材高中历史 第一单元 第1课 中华文明的起源与早期国家教案3 新人教版必修《中外历史纲要(上)》
- 2024城市轨道交通建设合同标的
- 2024年农田林网建设及果树种植承包合同
- 2024年大额个人借款正式合同
- 2024企业信息化建设合同属性规定
- 2024年基因检测与药物研发合同
- 2024年工程保险与担保协议
- 2024年品牌授权使用合同包含知识产权保护
- 乔丹体育侵权案例
- 广告学专业大学生职业规划
- 第一讲人民币汇率与人民币国际化
- 《世界的聚落》知识点解析
- 通达信系统指标公式
- 2024中国罕见病行业趋势观察报告
- 创作属于自己的戏剧舞台美术设计
- 苏教版2022-2023五年级数学上册全册教材分析
- 埋地钢质管道腐蚀与防护
- 人工智能对教育考试的改革与应用
- 会议宴会接待通知单
评论
0/150
提交评论