淡入淡出的皮肤更换程序

 如果无法看到图片,请到我的QQ空间,传送门:http://user.qzone.qq.com/346715656/blog/1254042029

经过一天的写程序和一天的修改,换皮肤程序也算是完成了,首先,先让我介绍下它的有什么样的功能吧:
1、皮肤更换。(皮肤更换程序嘛,这个当然是主打。我用的皮肤工具是SkinMagic,包括里面附带的十种皮肤,一个不拉的被我应用了。)

关于SkinMagic的使用方法,可以去网上找.
2、可以选择自己喜欢的皮肤进行更换,更换的时候程序会先淡出,然后再淡入.如图:

图片
图片
图片
3、既然做了淡入淡出的功能,干脆把程序开始,关闭,模式对话框和非模式对话框也一并使用淡入淡出功能.

在这里就不在图示了.

嗯,接下来说下关键代码部分吧.

1、SkinMagic的应用,去百度一下,别人已经说得非常详尽,我就不再重复了.

2、有关皮肤选项:

图片
在这里便是我的十个皮肤,外加原始程序的皮肤选项.程序开始是默认经典XP,也是就程序自带的.函数CheckMenuItem可以设置选项打勾.具体用法自行看MSDN或者百度.

当然,我是把皮肤更换的核心代码写在Skin类里面,一起看看有什么内容吧:

Skin.h文件:

图片
Skin.cpp文件:

图片
里面的参数其实很简单,关键两个是wid和one

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,请注明来意.

嗯,接下来``继续其他控件的学习和使用

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值