如果无法看到图片,请到我的QQ空间,传送门:http://user.qzone.qq.com/346715656/blog/1254042029
经过一天的写程序和一天的修改,换皮肤程序也算是完成了,首先,先让我介绍下它的有什么样的功能吧:
1、皮肤更换。(皮肤更换程序嘛,这个当然是主打。我用的皮肤工具是SkinMagic,包括里面附带的十种皮肤,一个不拉的被我应用了。)
关于SkinMagic的使用方法,可以去网上找.
2、可以选择自己喜欢的皮肤进行更换,更换的时候程序会先淡出,然后再淡入.如图:
3、既然做了淡入淡出的功能,干脆把程序开始,关闭,模式对话框和非模式对话框也一并使用淡入淡出功能.
在这里就不在图示了.
嗯,接下来说下关键代码部分吧.
1、SkinMagic的应用,去百度一下,别人已经说得非常详尽,我就不再重复了.
2、有关皮肤选项:
在这里便是我的十个皮肤,外加原始程序的皮肤选项.程序开始是默认经典XP,也是就程序自带的.函数CheckMenuItem可以设置选项打勾.具体用法自行看MSDN或者百度.
当然,我是把皮肤更换的核心代码写在Skin类里面,一起看看有什么内容吧:
Skin.h文件:
wid:是选项ID,是你当前选择的皮肤项,
one:其实就是第一个皮肤的ID,
这些ID的数值都是整形,并且是递增顺序的.这样,skinType[wid-one]才不会出现错误.
skinType数组设定了所有皮肤选项,如果你有新皮肤,可以继续增加.
值得注意的是,当你在菜单选项里面增加选项,然后改ID名称时,ID的值不一定是顺序的,这时,我们就要打开resource.h文件,找到对应ID,将值改成顺序的:
还有一个会出现错误的问题,在导入皮肤资源时,一定要把皮肤资源导入到同一个文件下,不然,嘿嘿,可有得忙了,我的是SkinMagic,然后你势必要修改皮肤的ID名字,在这里,一定要注意,比如你的命名是CORONA,那你一定要在这个名字加上""号,也就是"CORONA",不然程序可能会识别不了,
如果你不幸忘记加""号,事后又想来改变的话,程序也可能识别不了了,因为在resource.h文件里面已经生成没有""号的ID值,所以,你要手动进入这个文件,找到它并且把它删除.这样就可以用了
好把好吧````再给你图示指引一下:
这样应该很清楚了吧?基本上,到这里,一个完整的皮肤更换程序就完成了.
之前我到网上看到一片文章,方法基本上跟我的一样,不过,他做出来的程序必须事先就用一个皮肤,而无法使用原始皮肤.这样一来```多不好~~.其实改进的方法很简单,我只要每次更换皮肤时,都重新设置下主窗体和对话框的皮肤,OK了.虽然每次都要调用一次函数,不过不1秒钟又不需要重复几百万次,你也没那么快,所以并不会有太大的开销,关键是,谁会无聊把一个程序换几百次皮肤?其实,,就是换一天,也可以......
这个是传送门,可以去LOOK下人家的:http://blog.myspace.cn/e/404150556.htm
好吧好吧,如果只是换个皮肤而言,肯定难不倒你,既然皮肤都换了,倒不如再根据更换皮肤的时候做个淡入淡出的效果,岂不是显得更有神韵?
3、淡入淡出
淡入淡出,无非就是用到透明函数.你可以很懒的,很不负责任的在百度上一搜:VC淡入淡出功能,当然别忘了加个SDK,不然大部分都是MFC条件下的,什么?你就是学MFC的,当我没说过吧``````
如果没有错误,应该很快就发现了AnimateWindow这个函数,并且很容易就可以用起来.
在我空间就有这个资料,传送门:http://user.qzone.qq.com/346715656/infocenter?ptlang=2052
可是,随后你很快就会发现,这个方法出来的效果非常差,有黑色阴影,而且,用在更换皮肤程序里面,往往是皮肤换好了```可就是不变给你看``貌似有解决方法,可我看不懂`伤心啊,
还能说什么,继续找啊``````
嗯,SetLayeredWindowAttributes函数进入我的眼睛.可惜啊,程序居然说找不到这个函数,气死我了,不甘心地找问题所在```发现是版本不对.于是在文件开头加了个#define _WIN32_WINNT 0x0500
居然能用了```真是`````我太佩服找出问题的人了``
嗯,函数能用了,再配合SetTimer,你就可以在规定时间内改变透明度了.
步骤是这样的:
(1)你需要得到窗口句柄
(2)根据窗口句柄,设置窗口的样式为:WS_EX_LAYERED.这个是必然要加的,不然你无法设置透明度
(3)写TimerProc回调函数,在里面就可以设置透明度了,也可以在WM_TIMER里面设置,看你喜欢了.
(4)如果效果出来了,把功能打包到一个类里面把,不然WinMain函数里面会一团混乱的,再者还可以提高代码的重用率呢.
嗯,写个Fade.h文件,里面的定义也很简单:
再看看Fade.cpp文件
咋样?是不是比写在WinMain要明了清晰很多,````上面都有注释了```我都没办法再进行解释了
不过,这里还是没有涉及到皮肤的更换,反而是对话框的淡入淡出,因为皮肤资源的加载不在同个文件,有些麻烦,所以就在WinMain文件里面设置了,
只需要在淡入和淡出调用Fade里面的SetTime函数,设置事件(1~6)就可以了,
问题:
在关闭主窗体的时候,总是无法实现淡出,急死我了```无非就是响应WM_CLOSE事件,后来,才发现把break改成renturn 0;完美解决.
嗯,在创建的模式窗口,没有句柄怎么办?没有句柄就无法实现透明啊`````
什么GetWindow,GetDlgItem``````试了个遍``都没找到```
后来才想起``干吗那么麻烦,直接在WM_INITDIALOG,对话框初始化的时候就可以用啊``他的回调函数就有句柄的```
后记:
没办法把源上传```如果不幸想做这个效果``又不太明白我上面说的,直接Q我吧```346715656,请注明来意.
嗯,接下来``继续其他控件的学习和使用