C# 皮肤更换

C# 专栏收录该内容
2 篇文章 0 订阅

根据 http://wediolee.blog.hexun.com/16672909_d.html 的文章进行更改。

 

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)这里没有想令原作者难堪的意思。

  • 0
    点赞
  • 4
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页

打赏作者

thiswolf

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值