




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、青岛理工大学c+课程设计报告院(系): 计算机工程学院 专 业: 计算机科学与技术 学生姓名: 胡松朝 班 级:计算073 学号: 200707046 题 目: 屏幕保护程序起迄日期: 2009.12.212009.12.31 设计地点: 青岛理工大学2#实验楼402 指导教师: 李兰 完成日期: 2009 年 12 月 31 日一、需求分析1、 选做此课题或项目的意义:对于电脑用户来说,选择电脑时,首先提出的指标一定是奔腾、赛扬等一系列与cpu有关的数据,电脑的心脏固然重要,但对于经常与电脑打交道的人来说,电脑的“脸”显示器,同样是最关心的问题之一。如果你每天面对的是一个色彩柔和、清新亮丽的
2、“笑脸”,你在它身边工作一定特别来劲,工作效率也一定会提高。当你买了一台电脑后,希望它的寿命的时间越长越好,这样你既可以享受电脑给你带来的快乐,还可以不要花太多的钱来维护你的电脑。屏幕保护程序可以起到保护你的显示器的作用,这样可以相对减少你的金钱支出。在未启动屏保的情况下,当你长时间不使用电脑的时候显示器的屏幕长时间显示不变的画面,这将会使屏幕发光器件疲劳变色/甚至烧毁/最终使屏幕,某个区域偏色或变暗。 对于crt的显示器来说,在图形界面的操作系统下,显示屏上显示的色彩多种多样,当用户停止对电脑进行操作时,屏幕显示就会始终固定在同一个画面上,即电子束长期轰击荧光层的相同区域,长时间下去,会因为
3、显示屏荧光层的疲劳效应导致屏幕老化,甚至是显像管被击穿。屏幕保护程序一直作为保护crt显示屏的最佳帮手,通过不断变化的图形显示使荧光层上的固定点不会被长时间轰击,从而避免了屏幕的损坏。另外,屏幕保护程序所提供的动画效果,可以给你的忙碌生活添加积分乐趣。2、 程序所实现的功能: 本程序为windows操作系统的屏幕保护程序。在程序运行时,会在屏幕最上方出现全屏窗口,自动载入满屏图片,同时由上至下出现大小随机速度随机的白色雪花慢慢摇曳飘落,黑色调的浪漫图片从右至左缓缓流动,伴随着美妙音乐,给人视觉享受。当按下键盘非系统键,或按下鼠标左、右及滚轮键时程序自动退出,为了防止桌面震动带来的影响,鼠标必须
4、移动大于200像素的距离,屏保程序才能退出。二、设计内容1、系统功能模块图:2、系统数据流图如下:3、关键代码:bool cmyscreendlg:oninitdialog()/初始化对话框cdialog:oninitdialog();/ set the icon for this dialog. the framework does this automatically/ when the application's main window is not a dialogseticon(m_hicon, true);/ set big iconseticon(m_hicon, fal
5、se);/ set small icon/ todo: add extra initialization herecrect m_rcmain;/设一个矩形对象getwindowrect(&m_rcmain);/得到窗口并存储long style=getwindowlong(m_hwnd,gwl_style);/得到窗口状态 style &= ws_caption; /creates a window that has a title bar (includes the ws_border style).setwindowlong(m_hwnd,gwl_style,style)
6、; /设置窗口s_showw = getsystemmetrics(sm_cxscreen); / 得到屏幕宽度s_showh = getsystemmetrics(sm_cyscreen); /得到屏幕高度/show window for (int i=1; i<=snowcount; i+)/进入循环,随机生成雪点的速度及坐标,共300个snowi.speed = rand()%10;snowi.x = rand()%s_showw;snowi.y = rand()%s_showh;setwindowpos(null,-20,0,s_showw+25,s_showh,swp_nozo
7、rder);/设置窗口位置及大小,要比屏幕大些,遮盖整个屏幕:getcursorpos(&w_point);/获得鼠标的位置showcursor(false);/隐藏鼠标 settimer(1,1,null);/图片流动定时 settimer(2,300,null);/雪花定时return true; / return true unless you set the focus to a controlvoid cmyscreendlg:onpaint() /画图片和载入音乐if (isiconic()cpaintdc dc(this); / device context for pa
8、intingsendmessage(wm_iconerasebkgnd, (wparam) dc.getsafehdc(), 0);/ center icon in client rectangleint cxicon = getsystemmetrics(sm_cxicon);int cyicon = getsystemmetrics(sm_cyicon);crect rect;getclientrect(&rect);int x = (rect.width() - cxicon + 1)/2 ;int y = (rect.height() - cyicon + 1)/2 ;dc.d
9、rawicon(x, y, m_hicon);elsecpaintdc dc(this); /创建设备上下文类的对象 w_pdcmem = new cdc;/分配新的内存 w_bitmap.loadbitmap(idb_bitmap1);/载入图片 w_pdcmem->createcompatibledc(&dc);/关联内存 w_pdcmem->selectobject(&w_bitmap);/图片载入内存 w_showx = 0; /初始为0 sndplaysound( "music.wav" , snd_async | snd_loop )
10、; /载入音乐cdialog:onpaint();void cmyscreendlg:drawbitmap()/填充整个窗口,并显示cclientdc dc(this);cdc dcmem;cbitmap bitmap;bitmap.createcompatiblebitmap(&dc,s_showw,s_showh);dcmem.createcompatibledc(&dc);dcmem.selectobject(&bitmap);dcmem.setbkmode(0);dcmem.fillrect(&crect(0,0,s_showw,s_showh), &a
11、mp;cbrush(rgb(0,0,255);/填充整个屏幕为蓝色(这步可以省)uint y =0; /从内存读取填充矩形和图片一并拷贝到屏幕上dcmem.stretchblt( 0,y,s_showw,s_showh, w_pdcmem, w_showx,0,s_showw,s_showh, srccopy);dc.bitblt(20,0,s_showw,s_showh,&dcmem,0,0,srccopy);/显示在屏幕上void cmyscreendlg:onlbuttondown(uint nflags, cpoint point) / todo: add your messa
12、ge handler code here and/or call defaultpostmessage(wm_close);cdialog:onlbuttondown(nflags, point);void cmyscreendlg:onkeydown(uint nchar, uint nrepcnt, uint nflags) / todo: add your message handler code here and/or call defaultpostmessage(wm_close);cdialog:onkeydown(nchar, nrepcnt, nflags);/其他消息响应函
13、数原理如上,不再列出void cmyscreendlg:ontimer(uint nidevent) /定时器函数,用于定时刷新窗口实现动态效果w_showx += 1;/每次移动一个像素if(w_showx>=1050)/当图片移动大于1050像素时,从新显示 w_showx = 0; drawbitmap( );/显示位图cdialog:ontimer(nidevent);/定时器1cclientdc dc(this);for (int i=1; i<=snowcount; i+)/设置300个雪点的状态snowi.y += snowi.speed;/雪点纵坐标与速度相关if
14、(snowi.y > s_showh)/当雪点的纵坐标大于屏幕高度时,调整坐标,更换速度snowi.x = rand() % s_showw;snowi.y = -snowi.speed;snowi.speed =rand()%10;point(&dc,snowi.x,snowi.y,int(snowi.speed/4)+1);/保存雪点状态cdialog:ontimer(nidevent);/定时器2void cmyscreendlg:ondestroy() cdialog:ondestroy();/ todo: add your message handler code he
15、redelete w_pdcmem;killtimer(1);/关掉计时器1killtimer(2);/关掉计时器2void cmyscreendlg:onactivateapp(bool bactive, htask htask)/只允许一个程序运行cwnd:onactivateapp(bactive, htask);/ todo: add your message handler code hereif (!bactive) /is being deactivated postmessage(wm_close); void cmyscreendlg:point(cdc *dc, int x
16、, int y, int size)/画雪点,大小和速度一致cpen lpen(ps_solid, size+1, rgb(255,255,255);/设置画笔dc->selectobject(&lpen);/选择画笔dc->moveto(x,y);/移动当前点到(x,y)上dc->lineto(x,y);/在(x,y)画直线,即本点上画直线,相当于画个点,作为雪花三、调试分析1、系统性能分析:在windows环境下,采用microsoft visual c+ 6.0作为开发工具,并使用mfc application framework作为本软件的基本架构。采用c+来
17、进行图像编程的主要原因是,与java和c#等现代编程语言相比,c+在程序运行的效率、内存使用的可控性和编程的灵活性上具有优势。因此本设计使用microsoft visual c+ 6.0作为软件的开发平台。针对程序中要提供软件的选择性,这要通过不同的控件来实现。对不同的控件添加不同的消息响应甚至添加一个新的类或者使用继承的类。本程序运行不需要太高的机器配置,普通的pc机运行流畅。2、上机过程中出现的问题及其解决方案: 图1出现较严重的问题如下:1、cmyscreendlg:oninitdialog()函数中:setwindowpos(null,0,0,s_showw,s_showh,swp_n
18、ozorder);背景不能填充全屏,不美观,如图1。更改后:setwindowpos(null,-20,0,s_showw+25,s_showh,swp_nozorder);2、弄错了图像的尺寸大小,导致图像不能居中显示3、在增加下雪效果时没有增加定时器,代码无语法错误,但运行时逻辑错误,更正方法:增加一个定时器2,作为雪点变换的定时器,独立于图片流动的定时器1,雪点一定要画出图片之后开始画,在最外层。图23、 雪点的大小和速度不美观(如图2),多次调整后参数设置为:cpen lpen(ps_solid, size+1, rgb(255,255,255); snowi.y += snowi.s
19、peed;/雪点纵坐标与速度相关if (snowi.y > s_showh)snowi.x = rand() % s_showw;snowi.y = -snowi.speed;snowi.speed =rand()%10;point(&dc,snowi.x,snowi.y,int(snowi.speed/4)+1); 4、更换和调整图片,用到photoshop软件作图,图片的大小应适合屏幕尺寸。3、程序中可以改进的地方说明:本程序只能载入格式为.bmp的图片文件和格式为.wav的音频文件,这两种格式的文件很大,占用相对多的磁盘空间,可以更改成能载入.jpg格式图片和.mp3格式的
20、音频文件就可以节省相比下的大约10倍空间,这是最不足的地方。4、 程序中可以扩充或改进的功能:本程序的功能相对简单,可以增加调整雪花速度和数量、多张图片载入以及音乐的开关和调整功能。可以在做一个控件对话框,为用户提供选择和调整权力。另外,可以把鼠标的右键作为在屏保运行时的音乐开关键,这样会使屏保更加友好。四、系统测试1、 测试方法 在debug下生成的.exe可执行文件更改后缀个格式为.scr,然后把此文件连同音频文件一并拷入系统屏保所在的文件夹里,设定系统的屏保为myscreen,时间设定为1min,则在1min后看屏保是否可正常流畅运行。2、 测试结果 图3 屏保运行时的截图如图3所示。五
21、、用户手册在debug下生成的.exe可执行文件更改后缀个格式为.scr,然后把此文件连同音频文件一并拷入系统屏保所在的文件夹里,路径为c:windowssystem32。在桌面右击属性,然后调整如图4所示。时间到了以后,屏保自动运行。 图4六、设计总结开始不懂得如何让程序全屏显示,只知道-屏保的基本思想是基于对话框的,就是一个满屏显示的对话框,在对话框上自动进行一些动画之类的东西。理论视乎简单,但在真正动手去做的时候,就遇到了很多困难。电脑屏幕窗口是各异的,不是简简单单对于自己的机器屏幕尺寸去设计对话框的大小,经过查阅网上资料,才得知需要用到一个获得显示器屏幕尺寸的系统函数:getsyste
22、mmetrics(sm_cxscreen)和getsystemmetrics(sm_cyscreen),最容易忽略的一点是要隐藏鼠标,屏幕保护如果还有鼠标出现的话是很难看的,不专业的,这是用到一个很简单的库函数showcursor(false),就可消去鼠标了。图片先载入到内存中,然后从内存中读取到屏幕,这样就可以避免后面图片流动不出现闪动现象。设定时器,每个0.1秒屏幕刷新一次,此时要时屏幕上图片显示的区域横坐标减少一个像素,这样就可以是图片每隔0.1秒向左移动一个像素的距离,看上去图片流动起来。设计雪花时也费了不少功夫,查了很多资料,为了不让雪花遮盖图片,选用了粒子知识来设计雪花程序,简练美观。消息响应也是一个要精心准备的部分。对于crt的显示器来说,在图形界面的操作系统下,显示屏上显示的色彩多种多样,当用户停止对电脑进行操作时,屏幕
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年游泳救生员资格考试的变化及试题及答案
- DB36T-地理标志产品 宜春野茶油编制说明
- 园艺植物病虫害防治75
- 2024年游泳救生员资格考试的特殊题型试题及答案
- 2024年篮球裁判员等级考试精要试题及答案
- 五年级数学(小数乘除法)计算题专项练习及答案汇编
- 探索种子繁育员的工作环境试题及答案
- (高清版)DB50∕T 822-2017 既有居住建筑信息化改造规范
- 模具设计项目案例分析试题及答案
- 新建半导体集成式磁传感芯片项目可行性研究报告(范文参考)
- 多物理场模拟仿真
- 神经外科科室质量管理小组工作制度
- 常见职业病危害和预防基础知识
- 山东省2024年夏季普通高中学业水平合格考试地理试题02(解析版)
- 英语四级模拟试题(附答案)
- 人教版八年级下册-中考生物必背知识复习提纲
- 预包装食品标签审核表
- 《高等教育学》历年考试真题试题库(含答案)
- 福建晋华的测评题库
- 干部履历表填写范本(中共中央组织部1999年)
- 汽车修理店维修管理制度
评论
0/150
提交评论