Winform窗体换肤(仿迅雷7)
前一段时间因为有需要,做了一个关于winfrom 程序换肤的程序,刚开始的时候想图个简单,就用个皮肤控件引用一个就完了,可是那个效果很不是让人满意,主要是没有达到要求的效果,操作不够灵活,所以只有放弃那种简单的方法了。我看到迅雷7的换肤做的很好,我是不是可以模仿这做这下呢,刚开始的时候没有多大的头绪,做起来比较吃力。
接着我们老大推荐我在网上看到一篇关于winfrom窗体换肤的文章,对我的启发很大,采用了窗体重绘的方式,全部重写了窗体的界面,这样也从根本上能控制窗体的皮肤,先做一个窗体的基类,绘制好基类窗体,等做好了之后,其它需要适用这个窗体风格的都继承它就可以了。这是那篇文章的地址http://www.csharpwin.com/csharpresource/2992.shtml
先把效果贴出来。我这个是仿照迅雷的风格做的,
(1)主体窗口
(2)皮肤的主题调节窗体
(3)选择主题自动关联最合适的配色方案,配色方案可以改变整个窗体的按钮以及其它控件的颜色,弹出窗体有逐渐淡化效果。每点击另一种主题,所有继承于基类窗体的马上变换(类似于迅雷7)。
(1)主体窗口
(2)皮肤的主题调节窗体
(3)选择主题自动关联最合适的配色方案,配色方案可以改变整个窗体的按钮以及其它控件的颜色,弹出窗体有逐渐淡化效果。每点击另一种主题,所有继承于基类窗体的马上变换(类似于迅雷7)。
(4)精细化边框模式,以及控制按钮。包括鼠标移上去的明显显示,以及边框圆角,控制按钮的圆角搭配,包括子窗体的渐变效果,透过效果。这块是发了很多时间去弄的。
(5)透明度的开启调节
(6) 灵活个性化的处理。主题可以任意添加和删除,只需要添加指定图片即可,图片就可以自动加载。
上面那篇文章提供了一个基本的做法思想给我,看懂了基本的方法之后,具体的做法当然还是要靠自己。
二、在开发中碰到的技术难点。
(1)刚点击换肤方案,其各个窗体马上显示效果,不需要等到换肤窗口保存关闭。
解决:这个可以通过活动窗口的切换来做到这个点,在切换活动窗口的时候我首先在网上去找好的方法,但都是说取句柄,取线程等等,操作起来非常麻烦,并且效果不是很理想,后来我们老大告诉我一个办法,直接在其它窗口定义一个static窗体变量,在其它窗口直接调用.Form.Temp.Activate()就行,效果立马就显示出来。
(2 )防止皮肤更换的时候或者改变窗口大小的时候窗体抖动。
解决:开启双重缓存。
private void SetStyles()
{
SetStyle(
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.OptimizedDoubleBuffer |
ControlStyles.ResizeRedraw, true);
UpdateStyles();
}
这样的效果能减轻一些的闪动。要想完全消除闪动,必须采用合理的重绘方法。我的这个当不开启透明效果的时候完成不会出现闪动,但当开启透明效果的时,改变窗口大小时就会有少许闪动,这个有待改进。
(3)窗体的亮度对比度已经色彩的控制,使窗体的效果更加好。
这个我是花了一些时间去调试,因为没有美术功底,对这一块不太熟悉,但要想使界面好看,这一块又必不可少。
(4)主题方案的拓展
图片以及色彩都要能根据用户的喜好自由拓展,这个就需要采用灵活的方式,不能适用固定的控件放置在窗体,都必须适用动态添加,根据文件的配置去做处理。
(5)把TabContorl控件设置透明能透出背景色。
这个做出功能是很简单的,把背景色设为透明就可以了,或者设置TransparencyKey,但是纯粹这个设置的话加载窗体的时候会出现是闪动,同时切换的时候感觉速度有所变慢,这个后来是重新自己重绘了TabContorl控件,改变其样式,
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT
return cp;
}
}
这个可以减轻绝大部分闪动,基本可以忽略不记了。
经过半个月的时间,把这个窗体换肤的大体部分已经做出来了,设计方面都是仿照的迅雷7(个人设计水平有限),当然有些方面还是没有迅雷7做的好,只是把其换肤基本功能实现,要是在美工上和程序上再加以改进,也会能做出更好的效果。
经过半个月的时间,把这个窗体换肤的大体部分已经做出来了,设计方面都是仿照的迅雷7(个人设计水平有限),当然有些方面还是没有迅雷7做的好,只是把其换肤基本功能实现,要是在美工上和程序上再加以改进,也会能做出更好的效果。
如果有需要的博友可以到下面下载,下面的是一个窗体的基类的重绘,别的窗体继承这个窗体就行了,不过声明一下,这一部分的代码是我在上面我提供的那个网址的基础上修改的,同时把一些的关键地方做了一些注释,能更容易读懂一些,还有一些的地方可能是我在调试的时候弄的一些可能没有用的代码没有整理的删除的只是注释掉了。如果把这个东西看懂关键地方,根据自己的需求修改一下,那么这个换肤就已经完成了90%以上的工作。