摘 要:桌面壁纸更换;桌面图标排列;桌面图标游戏;设计与实现
关键词:
1引言
计算机技术的发展日新月异。在短短半个多世纪的时间里,计算机已从原来的科研,国防等领域迅速渗透到了各行各业,整个人类文明已经几乎离不开计算机。“计算机解放运动”所提出的“让个人计算机进入每一个家庭,占据每一张书桌”的目标正在一步步实现。为了方便电脑桌面的管理,我们开发了这一桌面小工具——funnydesk,。本软件的最终目标是让每一位普通计算机用户方便地更换桌面壁纸,愉快地管理桌面上的图标。
2系统总体结构设计
我们将funnydesk总体分为三大功能模块:桌面壁纸更换、桌面图标排列和桌面图标游戏。在每个功能模块下,又细分了若干功能子模块。具体结构设计如图1所示。
图1系统总体结构设计
3系统模块设计
3.1桌面壁纸更换模块
图2桌面壁纸更换模块
如图2所示,在“图片”区域点击“浏览”,可以选择壁纸所在文件夹,同时在右侧小窗口中显示该文件夹下第一张图片(图片格式可以为bmp、jpg、jpeg,但在小窗口中显示时都将其转换为bmp格式,并将图片的长宽压缩,以适应窗口的大小)。点击“上一张”、“下一张”实现该文件夹下所有图片的快速浏览。
在“样式”区域可选择“居中”、“拉伸”、“平铺”三种壁纸样式。
在“频率”区域可设置壁纸自动更换的时间间隔。间隔单位包括时、分、秒,在单位前可以指定一个数字n,表示n个间隔单位更换一次壁纸。在选择“定时更换壁纸”后,funnydesk会每隔指定的时间间隔将壁纸更为所选文件夹中的下一张图片。
3.2桌面图标排列模块
图3桌面图标排列和桌面图标游戏模块
如图3所示,在“图标排列”区域点击相应按钮,可将桌面上的图标排列成对应图形。在“图标位置”区域可实现图标所排成的各图形的放缩和平移。
3.3桌面图标游戏模块
本模块的功能是以桌面为背景,用桌面上的图标进行贪吃蛇的游戏。桌面上的图标依次从桌面上出现,当把桌面上所有的图标“吃光”后,游戏胜利;当贪吃蛇的头与身体发生碰撞,游戏失败。具体设计如图3所示。
4系统关键点的实现
funnydesk利用vc++ 6.0作为应用开发工具,基于MFC实现。
4.1桌面壁纸更换的实现
该功能的实现应用了Windows Shell API中完成壁纸更换的接口:IActiveDesktop对象。
1.由于此函数引用了COM组件,所以须在C**App::OnInitInstance()中,初始化COM组件。
2.在BOOL EnableActiveDesktop()函数中使用IActiveDesktop对象。
IActiveDesktop* pIAD
//创建接口的实例
hr=CoCreateInstance(CLSID_ActiveDesktop,NULL,CLSCTX_INPROC_SERVER,
IID_IActiveDesktop, (void**) &pIAD );
hr = pIAD->SetWallpaper(wszWallpaper, 0); //更换壁纸
hr = pIAD->SetWallpaperOptions(&wpo, 0); //设置壁纸样式
3.利用BOOL EnableActiveDesktop()这个函数可以很方便的更换壁纸及设置壁纸样式。定时更换则利用SetTimer定时调用EnableActiveDesktop()实现。
4.2桌面图标排列的实现
1. 定位桌面图标
把桌面上的图标放到指定的坐标(屏幕为坐标系)位置上。笔者经过查阅资料,整理了如下API函数,实现图标定位。
FindWindow(“progman”,NULL)
FindWindowEx(handle,NULL,”SHELLDLL_DefView”,NULL)
FindWindowEx(handle,NULL, “SysListView32”,NULL)
如上3个函数都会返回一个窗口句柄handle,可用其找到桌面窗口,并对其上图标进行操作。Windows XP系统会对桌面上的图标进行系统编号,SENDMESSAGE(handle,LVM_SETITEMPOSITION,图标编号,MAKELPARAM(X,Y)),可以对已有图标发送定位命令,实现具体图标的定位操作。
2. 用桌面图标排列具体形状
图4排列为圆形的示意图
设A为基准点,其坐标为A(CircleX,CircleY),其他任意图标B的坐标为(x,y),则
y = CircleY +r*(1-cos(i*2*3.1415926/nNum));
x = CircleX +r*sin(i*2*3.1415926/nNum);
其中,θ= i*2*3.1415926/nNum,nNum为桌面上的图标总数。
时钟的实现在画好圆的基础上,取系统时间,据此画出时针、分针,然后每隔一定时间重绘一次时针、分针即可。矩形、三角形的画法较简单,在此不再赘述。
4.3桌面图标游戏的实现
1. 定位桌面图标,与“桌面图标排列”中方法相同。
2. 链接图标,这是游戏的核心,笔者把每个图标都定义为宽度为width,高度height的长方形,把整个桌面设置为宽度为n*width,高度为height*m的坐标系。当弹出的图标横坐标为width的倍数,纵坐标为height的倍数,就可以确保“蛇头”可以吃到它。
5结束语
桌面小工具funnydesk提供了桌面壁纸更换、桌面图标排列和桌面图标游戏的功能,让我们的桌面更加有趣、美观,增加了我们使用计算机的愉悦体验,同时,可使我们更有效地管理Windows桌面。
参考文献:
[1] 李涛,游洪跃,陈良银,李琳.C++ 面向对象程序设计.高等教育出版社,2007.6
[2] 侯俊杰.深入浅出MFC.华中科技大学出版社,2001.1