- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
到目前为止,时钟的各个部件都已经设计完毕,现在该把它们组装起来了。 刚才建立的四个类CClockBackground、CClockHourHand、CClockMinHand、CClockSecHand要为CClockEx服务,正如CClockElement为它们服务一样,不过服务的方式发生了变化,刚才是以继承的方式使用,现在需要将上面四个类实例化供CClockEx使用。因此,首先应该在类CClockEx为上四个类分别建立对象。在CClockEx的头文件中恰当位置加入以下代码: #include ClockBackground.h #include ClockHourHand.h #include ClockMinHand.h #include ClockSecHand.h class CClockEx : public CStatic { private: CClockBackground m_clockBK; //时钟背景 CClockHourHand m_clockHour; //时指针 CClockMinHand m_clockMin; //分指针 CClockSecHand m_clockSec; //秒指针 为了存储绘图区域的大小,需要在CClockEx中加入一个变量m_rcClient: CRect m_rcClient; //客户区域 在PreSubclassWindow函数中进行时钟的初始化工作。首先得为各个部件设定区域大小,然后启动定时刷新的定时器(100毫秒的定时器已经足够)。由于每个部件都有自己的默认颜色配置,因此这里暂且先使用默认配置,当然也可以自定义颜色: 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); //每100毫秒刷新一次 当控件大小发生变化时,控件状态要能够自动更新: void CClockEx::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::OnTimer(UINT nIDEvent) { Invalidate(FALSE); CStatic::OnTimer(nIDEvent); } 下面实现时钟的绘制,由于控件在不断刷新,按一般方式绘图,屏幕会不断闪烁,因此此处使用双缓冲绘图——就是在内存中绘图,绘制完毕时在Copy到屏幕上,这样可以有效的防止屏幕闪烁: void CClockEx::OnPaint() { CPaintDC dc(this); // device context for painting //实现双缓冲绘图——防止屏幕闪烁 CDC dcMem; dcMem.CreateCompatibleDC(dc); CBitmap bmp; 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); } 为了程序结构更清晰,我们将绘图函数放在一个单独的函数DrawClock中,下面室DrawClock的函数实现: void CClockEx::DrawClock(CDC *pDC) { CTime tmCur = CTime::GetCurrentTime(); m_clockBK.SetTime(tmCur); m_clockHour.SetTime(tmCur); m_clockMin.SetT
文档评论(0)