C# 皮肤更换

发布时间:2009年06月23日      浏览次数:1000 次
1. 使用 IrisSkin,即东日 Skin 方案 v2。
控件下载 :http://www.sunisoft.cn/download.htm,这是一个安装程序,既包含用于程序开发的DLL和皮肤文件,也包含一个皮肤的制作工具。安装后,可以注册到VS2002/3 或者 VS2005/8; 【若使用这一安装程序,则在程序运行时会弹出对话框,提示您使用的是未注册版本,比较烦。】
也可以到http://download1.csdn.net/down3/20070605/05142029888.rar下载非安装程序的版本。
2. 载入
1)添加引用。将IrisSkin2.dll添加到程序中。
2)然后在解决方案资源管理器里右击项目→添加→新建文件夹,文件夹名为skin。
建完skin文件夹后再右击这个文件夹→添加→现有项,在弹出的文件选择框里选*.*所有文件,再把解压出来的skin文件夹里的所有 .ssk 文件全选进去。
3)这时候我们可以看到skin文件夹里已经有了我们添加的所有的换肤文件了。再按shift键选中所有的skin文件夹里的文件,在属性栏里可以看到“生成操作”一栏,默认选项是“无”,保持不变。[我们把它改成“嵌入的资源”];另一栏是 “复制到输出目录”,改成“始终复制”或者“如果较新则复制”。(加删除线的是原作者的做法,我的方法是为了给用户更大的灵活性——他可以自由的增删皮肤文件,只需要对目录进行操作即可。)

3. 建类
建立一个新的类(最好如此,不包含在其他的用户界面类内)。
class SkinOperator
{
public static string filePath = "skin\\";

//从目录中得到所有的皮肤的类型名字字符串
public static string[] skinTypes = getSkinTypes(filePath);

private static string[] getSkinTypes(string path)
{
string[] skinTypes = Directory.GetFiles(path);
for (int i = 0; i < skinTypes.Length; i++)
{
int dashpos = skinTypes[i].LastIndexOf('\\');
int dotpos = skinTypes[i].LastIndexOf('.');
skinTypes[i] = skinTypes[i].Substring(dashpos + 1, dotpos - dashpos - 1);
}
return skinTypes;
}
public static Sunisoft.IrisSkin.SkinEngine se = null;

/// <summary>
/// 增加换肤菜单
/// </summary>
/// <param name="toolMenu"></param>
public static void AddSkinMenu(ToolStripMenuItem toolMenu)
{
foreach (string st in skinTypes)
{
toolMenu.DropDownItems.Add(new ToolStripMenuItem(st));
toolMenu.DropDownItems[toolMenu.DropDownItems.Count - 1].Click += new EventHandler(Form_Skin_Click);
}
toolMenu.DropDownItems.Add(new ToolStripMenuItem("系统默认"));
toolMenu.DropDownItems[toolMenu.DropDownItems.Count - 1].Click += new EventHandler(Form_Skin_Click);
((ToolStripMenuItem)toolMenu.DropDownItems[toolMenu.DropDownItems.Count - 1]).Checked = true;
}

static void Form_Skin_Click(object sender, EventArgs e)
{
for (int i = 0; i < ((ToolStripMenuItem)((ToolStripMenuItem)sender).OwnerItem).DropDownItems.Count; i++)
{
if (((ToolStripMenuItem)sender).Text == ((ToolStripMenuItem)((ToolStripMenuItem)sender).OwnerItem).DropDownItems[i].Text)
{
((ToolStripMenuItem)sender).CheckState = CheckState.Checked;
}
else
{
((ToolStripMenuItem)((ToolStripMenuItem)((ToolStripMenuItem)sender).OwnerItem).DropDownItems[i]).CheckState = CheckState.Unchecked;
}
}
if (((ToolStripMenuItem)sender).Text == "系统默认")
{
RemoveSkin();
return;
}
foreach (string st in skinTypes)
{
if (st == ((ToolStripMenuItem)sender).Text)
{
ChangeSkin(st);
return;
}
}
}
/// <summary>
/// 改变皮肤
/// </summary>
/// <param name="st"></param>
public static void ChangeSkin(string st)
{
if (se == null) //首次进行换肤前 se为null
{
se = new Sunisoft.IrisSkin.SkinEngine(Application.OpenForms[0], filePath + st + ".ssk");
se.Active = true;
for (int i = 0; i < Application.OpenForms.Count; i++)
se.AddForm(Application.OpenForms[i]);
}
else
{
se.SkinFile = filePath + st + ".ssk";
se.Active = true;
}
}
/// <summary>
/// 移除皮肤
/// </summary>
public static void RemoveSkin()
{
if (se == null)
{
return;
}
else
{
se.Active = false;
}
}
}

4.调用
在主窗体里加上一个MenuStrip菜单或者ContextMenuStrip菜单,建一个2级菜单(如:文件→更换皮肤),然后在Form_Load事件里写上调用代码
SkinOp.AddSkinMenu(tsmiChangeSkin); // tsmiChangeSkin是下拉菜单项或者弹出菜单项
5.说明
1) 原作者使用了DataSet skin = new DataSet(); 并且进行了XML文件的读写,但我不知道其意义何在。可能是要保存上一次运行的皮肤吧,但是我执行其程序的结果并非如此。
2) 原作者把皮肤文件直接嵌入到了资源文件中,最终的可执行程序比较清爽。
3) 我把skin文件保留了一个目录,相应的,程序里也做了一些改动:不再使用
System.Reflection.Assembly thisDll = System.Reflection.Assembly.GetExecutingAssembly();

//TestSkin是指命名空间,这里你可以换成你自己的。
se = new Sunisoft.IrisSkin.SkinEngine(Application.OpenForms[0], thisDll.GetManifestResourceStream("TestSkin.skin." + st.ToString() + ".ssk"));
se.SkinStream = thisDll.GetManifestResourceStream("TestSkin.skin." + st.ToString() + ".ssk");
而是
se = new Sunisoft.IrisSkin.SkinEngine(Application.OpenForms[0], filePath + st + ".ssk");
se.SkinFile = filePath + st + ".ssk";
4)这里没有想令原作者难堪的意思。
免责声明:本站相关技术文章信息部分来自网络,目的主要是传播更多信息,如果您认为本站的某些信息侵犯了您的版权,请与我们联系,我们会即时妥善的处理,谢谢合作!