昨天整理资料的时候突然看到自己写的一个小程序,当时写的也甚是费劲,所以就供给大家了,哄女孩子还是有点用处的!
灵感来源
这个灵感是在圣诞节那天,突然看到一个小程序叫Xmas
(连同我自己写的两个程序,已打包,点击这里下载),这个程序就是满屏飘雪花,还有一个圣诞节的音乐,很漂亮,看到之后就想给女朋友写一个飘心的小程序,女朋友的生日离圣诞节有些日子,但是得早早的开始写,毕竟,没有玩过Windows
的API
,MFC
,VC++
,所以只能自己摸索,到网上搜原理,根本搜不到这个软件的编写方法,网上有类似的,但是都没有这一个写的完美,所以,也是无奈之举,只能祭出大招:反编,然后一点一点分析!
最后才写出了程序,我都放在了github上面,代码里面有注释,我就不仔细讲代码了,欢迎fork
:
hearts-one-window-
hearts-multitudinous-windows-
艰辛过程
我反编用的是IDA
,不要问我为什么用这个,我也忘了,反正我记得是挺好用的,装好SDK
好像会自己把一些系统调用的地址解析成API
的名字。就是这么开始的,从程序开始一步一步追踪,先看他用了哪些API
,然后上网搜每一个API
的作用什么的,然后会大概有一个了解,然后开始考虑他的程序架构。
我记得Xmas
程序作者应该是个VC++
的玩家,显然程序使用类实现的,看程序属性和16
进制信息可以看到。
最蛋疼
最蛋疼的事就是透明窗口的事,到网上找带ALPHA
通道的图,找音乐,这些都弄好之后开始写程序,那时候还只是学了C
,C++
根本不会,就只能用C
写了。透明窗口找来找去没有处理ALPHA
的API
可以调用,就只找到两个(去看代码吧,我也忘了是什么了)。
处理带ALPHA
的图VC++
里面的类多,封装了多种类,我虽然知道图片的编码,但是自己写解析和图片的处理还是很吃力的,就只能将就用那两个傻的可怜的API
了,写出来的程序可想而知,很丑,还闪烁,hearts-one-window-是优化后的程序,还能看到有一部分处理的依然不好(欢迎大家提供更好的解决方案)。优化的方案就只是通过加双缓冲绘图来解决了闪烁的问题(给女朋友的就是这个版本,虽然如此,女朋友还是相当嗨皮的!)。
策略的改进
技术人对于技术的追求怎能就此止步!我分析了程序的性能,我的程序的性能居然还没有那个Xmas
高,我不知道为什么,而且绘图的效果还不好,我不甘心。后来换了每一个图作为一个透明窗口,创建的时候可以作为窗口背景皮肤(具体还是看代码~),就有了第二个程序hearts-multitudinous-windows-,这个程序的效率还是很高的,屏幕刷新率也高了,这就让我纳闷了,后来想想也对,我自己绘制窗口哪有操作系统绘制的效率高,而且操作系统更新屏幕只重绘窗口覆盖的部分,hearts-one-window-是一个全屏的透明窗口,整个屏幕都得重绘,而且程序自己还有一个内存绘图的部分,效率当然不高。而hearts-multitudinous-windows-只有一个窗口,绘图全是交给操作系统的,并且系统只重绘屏幕更新的部分,效率自然高很多。于是乎第二个版本出来了(这个还是停留在test
阶段,可以看到这个程序我基本什么都没有加就直接放在那里了,真是不想再看;不过发给女朋友时,女朋友也还是很嗨皮的)!
程序基本逻辑
- 创建固定个数的窗口
- 窗口显示
- 创建定时器(用来更新心的位置的,还有一些边缘检测和转向)
- 消息循环
具体的程序还是看代码吧,注释很齐全!
总结
整个过程还是挺好的,体验了一把反编,自己写了个感觉还算可以拿出手的Windows
的程序,也许学习了关于图片编码,Windows
窗体、消息的知识,收获还算不少,重要的是哄女朋友开心了!真是千金难买女朋友高兴~