昨天整理资料的时候突然看到自己写的一个小程序,当时写的也甚是费劲,所以就供给大家了,哄女孩子还是有点用处的!

灵感来源

这个灵感是在圣诞节那天,突然看到一个小程序叫Xmas(连同我自己写的两个程序,已打包,点击这里下载),这个程序就是满屏飘雪花,还有一个圣诞节的音乐,很漂亮,看到之后就想给女朋友写一个飘心的小程序,女朋友的生日离圣诞节有些日子,但是得早早的开始写,毕竟,没有玩过WindowsAPIMFCVC++,所以只能自己摸索,到网上搜原理,根本搜不到这个软件的编写方法,网上有类似的,但是都没有这一个写的完美,所以,也是无奈之举,只能祭出大招:反编,然后一点一点分析! 最后才写出了程序,我都放在了github上面,代码里面有注释,我就不仔细讲代码了,欢迎forkhearts-one-window- hearts-multitudinous-windows-

艰辛过程

我反编用的是IDA,不要问我为什么用这个,我也忘了,反正我记得是挺好用的,装好SDK好像会自己把一些系统调用的地址解析成API的名字。就是这么开始的,从程序开始一步一步追踪,先看他用了哪些API,然后上网搜每一个API的作用什么的,然后会大概有一个了解,然后开始考虑他的程序架构。 我记得Xmas程序作者应该是个VC++的玩家,显然程序使用类实现的,看程序属性和16进制信息可以看到。

最蛋疼

最蛋疼的事就是透明窗口的事,到网上找带ALPHA通道的图,找音乐,这些都弄好之后开始写程序,那时候还只是学了CC++根本不会,就只能用C写了。透明窗口找来找去没有处理ALPHAAPI可以调用,就只找到两个(去看代码吧,我也忘了是什么了)。

处理带ALPHA的图VC++里面的类多,封装了多种类,我虽然知道图片的编码,但是自己写解析和图片的处理还是很吃力的,就只能将就用那两个傻的可怜的API了,写出来的程序可想而知,很丑,还闪烁,hearts-one-window-是优化后的程序,还能看到有一部分处理的依然不好(欢迎大家提供更好的解决方案)。优化的方案就只是通过加双缓冲绘图来解决了闪烁的问题(给女朋友的就是这个版本,虽然如此,女朋友还是相当嗨皮的!)。

策略的改进

技术人对于技术的追求怎能就此止步!我分析了程序的性能,我的程序的性能居然还没有那个Xmas高,我不知道为什么,而且绘图的效果还不好,我不甘心。后来换了每一个图作为一个透明窗口,创建的时候可以作为窗口背景皮肤(具体还是看代码~),就有了第二个程序hearts-multitudinous-windows-,这个程序的效率还是很高的,屏幕刷新率也高了,这就让我纳闷了,后来想想也对,我自己绘制窗口哪有操作系统绘制的效率高,而且操作系统更新屏幕只重绘窗口覆盖的部分,hearts-one-window-是一个全屏的透明窗口,整个屏幕都得重绘,而且程序自己还有一个内存绘图的部分,效率当然不高。而hearts-multitudinous-windows-只有一个窗口,绘图全是交给操作系统的,并且系统只重绘屏幕更新的部分,效率自然高很多。于是乎第二个版本出来了(这个还是停留在test阶段,可以看到这个程序我基本什么都没有加就直接放在那里了,真是不想再看;不过发给女朋友时,女朋友也还是很嗨皮的)!

程序基本逻辑

  1. 创建固定个数的窗口
  2. 窗口显示
  3. 创建定时器(用来更新心的位置的,还有一些边缘检测和转向)
  4. 消息循环

具体的程序还是看代码吧,注释很齐全!

总结

整个过程还是挺好的,体验了一把反编,自己写了个感觉还算可以拿出手的Windows的程序,也许学习了关于图片编码,Windows窗体、消息的知识,收获还算不少,重要的是哄女朋友开心了!真是千金难买女朋友高兴~