C语言实训四:轻院大时钟屏幕保护程序1.doc_第1页
C语言实训四:轻院大时钟屏幕保护程序1.doc_第2页
C语言实训四:轻院大时钟屏幕保护程序1.doc_第3页
C语言实训四:轻院大时钟屏幕保护程序1.doc_第4页
C语言实训四:轻院大时钟屏幕保护程序1.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

“轻院大时钟”屏幕保护程序 设计人:廖永红本实训是一年级新生在学习基本法语知识后,进行的技能扩展训练,提高学生应用知识、发现知识的能力,拓宽学生对C语言编程应用的现解,包括工具认识、应用类别认识(标准C编程、Window C编程)。一、 实训战略目标:(学习方法)1 初步学会从网上、MSDN、技术书籍等有目的地查阅技术资料的能力,认识到获取资料的重要性。2 在学习中认识到:哪些东西是需要学习掌握、详细了解、懂得编写的,哪此信息、资料是符号性的、规定的、第三方的,不需要我们去记忆,只要会查找到并摘取就行了。(学会轻松学习,不要被复杂的假像吓吧,树立自已能行的信心)。3 认识到基础语法只是程序的粘合制,还有大量的领域知识及其相关的函数库、组件,需要我们去认识。4 死记是一种最无效的学习方法,“大概知道有这么个函数及它是用来做什么的”比“记得这个函数的单词、原型、参数要求及用法”更重要,不知道可能查啊。5 阅读别人程序、做几个完整的趣味程序是最好的学习方法。二、 实训战术目标:(技术知识)1 使用基本语法(if/while/for/switch等)表达要解决问题的逻辑的能力2 了解屏幕保护程序的需求与设计,程序特点与调用原理,时钟的需求与设计3 了解.net下控制台编程及windows编程简化框架4 学会使用时间(如:time()、localtime())、数学(如:sin()、cos()、按键处理(如:kbhit()、getch())的有关函数。5 掌握window下窗体绘图的机制、步骤、各种GDI函数的使用(参考资料), 了解异或绘图模式、透明绘图的原现与步骤。三、 项目工作过程需求分析与信息的获取屏幕保护程序本来就是一种可执行的exe文件,将其文件扩展名(.exe)改为.scr,然后把它复制放到系统目录(windowssystem32),就可以在桌面上设置其为当前屏保(桌面-属性-屏幕保护程序)。屏幕保护程序由系统“空闲超时”时自动运行,当用户触碰任一键时,程序退出。我们这里要做的屏保是:当系统“空闲超时”时在屏幕上呈现一个大时钟,指示当前时间,并指针会嘀嗒走动。(需求)图1 屏保界面示意图动手编程之前,大家要从网上或MSDN搜寻相关的技术资料:如何用C语言编程在屏幕上绘图?有哪些绘图函数?绘图机制如何?如可实现指针的运动?用控制台方式还是用windows编程模式?如用我们掌握的控制台方式,又如何在屏保期间隐藏控制台窗体?如何编程实现透明图象?等等。大家亲手去搜索查找,从中获取对项目有用的技术资料。附件为是搜到的一技术资料。建立工程及设计程序框架(1) 建立项目工程:打开Microsoft Visual Studio .NET 2003,建立一个名为gdqysln空白方案,指定方案的文件夹位置。在“解决方案资源管理器”中右击方案,选“添加”-“新建项目”,新建一个名为MineClock的项目(Visual C+项目, win32控制台项目)。(2) 设计程序框架如下:int main(int argc, _TCHAR* argv)做绘图的准备工作:取得屏幕(画板),了解屏幕的宽高属性,准备好画笔、画刷把原有的屏幕进行备份,这样,在屏保结束时可能恢复原屏幕景像 把时钟背景图象(文件)装载入内存的图象结构中把时钟图象画到屏幕上,在屏幕上得到时钟底图(静止部分) 取得当前时间,并转换、分离出时、分、秒数 用数学公式,据时、分、秒数,计算时针、分针、秒针的未端点坐标值 画出时针、分针、秒针while(1) 擦除上次画的时针、分针、秒针取得当前时间,并转换、分离出时、分、秒数 用数学公式,据时、分、秒数,计算时针、分针、秒针的未端点坐标值 重新画出时针、分针、秒针 Sleep(1000);/程序暂停,等待1秒钟 if (触碰了键) 恢复屏幕原图到屏幕exit(0); 编写实现代码(1) 在程序文件中包含所需的头文件, 设置有关的宏常数#include stdafx.h#include windows.h /windows标准API头文件,包括绘图API函数#include math.h /数学函数的头文件#include time.h /时间相关函数的头文件#include conio.h /输入输出有关头文件,包括kbhit()函数#define LEN_H 80 /时针长度#define LEN_M 100 /分针长度#define LEN_S 120 /秒针长度#define PI PI /园周率(2) 绘图前的准备程序绘图前要先决定在哪绘,形象地说:在哪一块画板上绘图,所谓的画板指的是在屏幕或某个窗体的区域内绘图,要获得这个区域的标识,术语称为:设备描述符(句柄)。用的函数原型如下:HDC hdc = getDC (HWND hwnd); /传入参数指定要在其上绘图的窗体的句柄, 为NULL表示要在屏幕上绘图要画线型图,如:直线、矩形、园等,需要建立一个画笔(结构变量),规定线条的颜色、粗细、虚实线等。还要把画笔(结构变量)选用到某个画板(设备描述符),此后在此画板上画的线都是画笔所规定的属性。要画实心图,需要建立一个画刷(结构变量),规定填充的颜色、纹理等,并选用到画板(设备描述符)。绘图前的准备程序:/取得屏幕的设备描述符句柄(代表要画的地方画板)HDC hdcscreen=GetDC(NULL); /取得图的宽与高 int w=GetDeviceCaps(hdcscreen, HORZRES); int h=GetDeviceCaps(hdcscreen, VERTRES); /建立画笔(指定线的粗细、颜色等)HPEN hpen=CreatePen(PS_SOLID,5,RGB(255,255,0); /选用笔hpen在屏幕hdcscreen上画SelectObject(hdcscreen,hpen);(3) 从文件载入图象从时钟背景图象文件载入图象(LoadImage)到内存中的一个图象结构中,再选放到(SelectObject)一个与屏幕一样(兼容)的画板内存区(虚屏幕设备)中,然后再从虚屏幕设备复制到屏幕设备上。/把图象文件装载入内存的 HBITMAP结构中HBITMAP bitmap = (HBITMAP)LoadImage(NULL,E:clock.bmp,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);/建立一个与当前屏幕兼容的内存空间HDC hdcsource = CreateCompatibleDC(hdcscreen);/创建存放图象的显示缓冲SelectObject(hdcsource,bitmap); /选入图象/把hdcsource中位图数据复制到hdcscreen中BitBlt(hdcscreen,0,0,w,h,hdcsource,0,0,SRCCOPY);(4) 取得当前时间的时、分、秒数,画指针VC+中计算机时间(也称日历时间)是从1970年1月1日零时起到现在的时间刻度数(嘀嗒数),要把它转换、分离为我们能理解的时、分、秒数。根据当前时间的时、分、秒数,及时钟中点、指针长度,算出各指针的未点坐标,从时钟中心点开始画线到各指针未点。图2 指针未端点的坐标计算公式/取当前时间,及转换、填充到时间结构中 struct tm *ptime;time_t now = time(0);/取得从1970.1.1到现在的嘀嗒数ptime = localtime(&now);/把时间信息填入tm结构int cx = w/2; /时钟中心点横坐标int cy = h/2; /时钟中心点纵坐标float angle;/计算指针未端坐标,注意:x,y坐标轴的方向对公式的影响angle = 2*PI*(float)ptime-tm_hour/12; /时针角度int hx=cx + LEN_H*sin(angle);int hy=cy - LEN_H*cos(angle);angle = 2*PI*(float)ptime-tm_min/60;/分针角度int mx=cx + LEN_M*sin(angle);int my=cy - LEN_M*cos(angle);angle = 2*PI*(float)ptime-tm_sec/60;/秒针角度int sx=cx + LEN_S*sin(angle);int sy=cy - LEN_S*cos(angle); MoveToEx(hdcscreen,cx,cy,0); LineTo(hdcscreen,hx,hy); /画时针 MoveToEx(hdcscreen,cx,cy,0); LineTo(hdcscreen,mx,my); /画分针 MoveToEx(hdcscreen,cx,cy,0); LineTo(hdcscreen,sx,sy); /画秒针(5) 每隔1秒,重取时间,擦掉原指针,重画指针擦掉图象有两种方法:用背景色重画,用异或模式重画(原理:两次异或同样的值,得到原值)。这里的背景是时钟图象,不是单一颜色,只能用异或模式重画的方式。设置异或绘图模式,在用原坐标重复一次绘指针,相当于擦掉原指针,再按新时间计算新的指针坐标,再在新坐标位置的画指针。while(1)/在原坐标处,第二次绘指针,相当于擦掉指针MoveToEx(hdcscreen,cx,cy,0);LineTo(hdcscreen,hx,hy); /画时针MoveToEx(hdcscreen,cx,cy,0);LineTo(hdcscreen,mx,my); /画分针MoveToEx(hdcscreen,cx,cy,0);LineTo(hdcscreen,sx,sy); /画秒针/再取当前时间,及转换、填充到时间结构中now = time(0);/取得从1970.1.1到现在的嘀嗒数ptime = localtime(&now);/把时间信息填入tm结构/计算新的指针未端坐标 angle = 2*PI*(float)ptime-tm_hour/12; /时针角度hx=cx + LEN_H*sin(angle);hy=cy - LEN_H*cos(angle);angle = 2*PI*(float)ptime-tm_min/60;/分针角度mx=cx + LEN_M*sin(angle);my=cy - LEN_M*cos(angle);angle = 2*PI*(float)ptime-tm_sec/60;/秒针角度sx=cx + LEN_S*sin(angle);sy=cy - LEN_S*cos(angle);/在新坐标处绘出指针MoveToEx(hdcscreen,cx,cy,0);LineTo(hdcscreen,hx,hy); /画时针MoveToEx(hdcscreen,cx,cy,0);LineTo(hdcscreen,mx,my); /画分针MoveToEx(hdcscreen,cx,cy,0);LineTo(hdcscreen,sx,sy); /画秒针 Sleep(1000); 将下面的设置异或绘图模式语句放在“(2)绘图前的准备程序”的后面,设置异或绘图模式。SetROP2(hdcscreen, R2_XORPEN);/设置异或绘图模式(6) 触碰了键盘时,退出程序在上步骤的while循环中,Sleep(1000)语句后,加上下面程序:if (kbhit()/引起系统重绘屏幕,恢复原屏幕图象InvalidateRect(NULL,NULL,1);exit(0);(7) 布置屏保程序到系统目录从项目文件夹的子文件夹Debug下,找到产品文件:MineClock.exe,改名为:MineClock.scr,然后复制到系统文件夹:windows/system32。到屏幕属性里就可以设置我们的屏保了,哈哈,成功啦。( 完 )技术资料附件:(1)最常用时间相关的数据结构与函数在标准C/C+中,我们可通过tm结构来获得日期和时间,tm结构在time.h中的定义如下:struct tm int tm_sec; /* 秒 取值区间为0,59 */int tm_min; /* 分 - 取值区间为0,59 */int tm_hour; /* 时 - 取值区间为0,23 */int tm_mday; /* 一个月中的日期 - 取值区间为1,31 */int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为0,11 */int tm_year; /* 年份,其值等于实际年份减去1900 */int tm_wday; /* 星期 取值区间为0,6,其中0代表星期天,1代表星期一,以此类推 */int tm_yday; /* 从每年的1月1日开始的天数 取值区间为0,365,其中0代表1月1日 */int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/;ANSI C标准称使用tm结构

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论