【IT168 技术文档】这个系列好久都没有更新了,貌似上一篇还是在今年五月份发布的。呵呵,不感慨了,还是开始介绍今天的内容吧! 这里说明一下这次实现的换肤都是基于贴图换肤的,并不可以像QQ那样还可以调整色调甚至自定义图片为背景。如果您已经有过这方面的经验,下面的内容或许不一定适合你。另外如果您对本文有兴趣请到最后下载源码对照阅读。如果您还没有看过这个系列前续的文章请先参阅这里,本文的内容是在那几篇的基础上建立的!
贴图换肤就是用不同的图片去画不同的地方的背景,最后形成了界面的一个整体样式外观(自己这样认为的,如有不对欢迎拍砖! )。只要我们将每个背景图片的位置以及大小信息记录下来,并在换肤的时候加载这些图片和信息并将它们画到背景上去就能实现换肤了。很简单吧~~
最终的效果图:
换肤实现
上面只是简单说了一下换肤的“原理”,下面这个换肤流程图或许能够帮助您更好理解它:
上面的这四个过程就对应了实际类中的四个主要方法:ReadIniFile,CaculatePartLocation,ReadBitmap和DrawBackground。我们一个一个来看:
ReadIniFile
这个方法主要用来读取皮肤配置信息。 什么?不知道配置信息长啥样?得了,那就给你看一眼吧。
这是个INI的配置文件,网上有很多方法教你怎么读取和写入INI了。我将它们封装成了ReadIniValue和WriteIniValue方法。读取出来的这些信息都放在各自的背景块变量中。这里所说的背景块就是前面一篇文章介绍到的将界面划分的九个区域,如果您不了解可以看看这个系列的前一篇文章。一个背景块就是一个类,这些类都继承于partbase基类。partbase类中就定义了配置文件中对应的几个变量和几个方法,具体的可以到源代码中查看这个类,不复杂。
{
try
{
string filePath = skinFolder + "\\config.ini";
//顶部
_topLeft.Height = _topMiddle.Height = _topRight.Height = int.Parse(IniHelper.ReadIniValue(filePath, "Main", "Top_Height"));
_topLeft.Width = int.Parse(IniHelper.ReadIniValue(filePath, "Main", "TopLeft_Width"));
_topRight.Width = int.Parse(IniHelper.ReadIniValue(filePath, "Main", "TopRight_Width"));
//底部
_bottomLeft.Height = _bottomMiddle.Height = _bottomRight.Height = int.Parse(IniHelper.ReadIniValue(filePath, "Main", "Bottom_Height"));
_bottomLeft.Width = int.Parse(IniHelper.ReadIniValue(filePath, "Main", "BottomLeft_Width"));
_bottomRight.Width = int.Parse(IniHelper.ReadIniValue(filePath, "Main", "BottomRight_Width"));
//中部
_centerLeft.Width = int.Parse(IniHelper.ReadIniValue(filePath, "Main", "MiddleLeft_Width"));
_centerRight.Width = int.Parse(IniHelper.ReadIniValue(filePath, "Main", "MiddleRight_Width"));
minButton.Width = int.Parse(IniHelper.ReadIniValue(filePath, "Main", "MinButton_Width"));
minButton.Height = int.Parse(IniHelper.ReadIniValue(filePath, "Main", "MinButton_Height"));
minButton.XOffset = int.Parse(IniHelper.ReadIniValue(filePath, "Main", "MinButton_X"));
minButton.Top = int.Parse(IniHelper.ReadIniValue(filePath, "Main", "MinButton_Y"));
maxButton.Width = int.Parse(IniHelper.ReadIniValue(filePath, "Main", "MaxButton_Width"));
maxButton.Height = int.Parse(IniHelper.ReadIniValue(filePath, "Main", "MaxButton_Height"));
maxButton.XOffset = int.Parse(IniHelper.ReadIniValue(filePath, "Main", "MaxButton_X"));
maxButton.Top = int.Parse(IniHelper.ReadIniValue(filePath, "Main", "MaxButton_Y"));
closeButton.Width = int.Parse(IniHelper.ReadIniValue(filePath, "Main", "CloseButton_Width"));
closeButton.Height = int.Parse(IniHelper.ReadIniValue(filePath, "Main", "CloseButton_Height"));
closeButton.XOffset = int.Parse(IniHelper.ReadIniValue(filePath, "Main", "CloseButton_X"));
closeButton.Top = int.Parse(IniHelper.ReadIniValue(filePath, "Main", "CloseButton_Y"));
selectSkinButton.Width = int.Parse(IniHelper.ReadIniValue(filePath, "Main", "selectSkinButton_Width"));
selectSkinButton.Height = int.Parse(IniHelper.ReadIniValue(filePath, "Main", "selectSkinButton_Height"));
selectSkinButton.XOffset = int.Parse(IniHelper.ReadIniValue(filePath, "Main", "selectSkinButton_X"));
selectSkinButton.Top = int.Parse(IniHelper.ReadIniValue(filePath, "Main", "selectSkinButton_Y"));
return true;
}
catch
{
return false;
}
}