c#换肤(2005)

http://netwenchao.itpub.net/post/31231/294099

先前贴的这篇文章大家可能觉的不太能理解,我注释也确实写的很少,步骤也不是很详细,现在重修改一下,希望大家能指正。

1:控件(破解版,只限.Net2005)和皮肤下载地址如下(用影音传送带等下载工具下载): http://download1.youkuaiyun.com/down3/20070605/05142029888.rar

2:载入 下载后的rar文件里有一个IrisSkin2.dll和一个skin文件夹。 添加引用,将IrisSkin2.dll引用进项目中。 然后在解决方案资源管理器里右击项目→添加→新建文件夹,文件夹名为skin。 建完skin文件夹后再右击这个文件夹→添加→现有项,在弹出的文件选择框里选*.*所有文件,再把解压出来的skin文件夹里的所有文件全选进去。 这时候我们可以看到skin文件夹里已经有了我们添加的所有的换肤文件了。再按ctrl键选中所有的skin文件夹里的文件,在属性栏里可以看到“生成操作”一栏,默认选项是“无”,我们把它改成“嵌入的资源”。

3:下面我们新建一个类,把以下的代码复制进去,别忘了把命名空间改成你自己的。 

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Windows.Forms;
using  System.Data;
// TestSkin命令空间,别忘了改成你自己的。
namespace  TestSkin
{
    
class SkinClass
    
{
        
public static Sunisoft.IrisSkin.SkinEngine se = null;
        
/// 增加换肤菜单 ///
        public static void AddSkinMenu(ToolStripMenuItem toolMenu)
        
{
            DataSet skin 
= new DataSet();
            
try
            
{
                skin.ReadXml(
"skin.xml", XmlReadMode.Auto);
            }

            
catch { }
            
if (skin == null || skin.Tables.Count < 1)
            

                skin 
= new DataSet();
                skin.Tables.Add(
"skin");
                skin.Tables[
"skin"].Columns.Add("style");
                System.Data.DataRow dr 
= skin.Tables["skin"].NewRow();
                dr[
0= "系统默认";
                skin.Tables[
0].Rows.Add(dr);
                skin.WriteXml(
"skin.xml", XmlWriteMode.IgnoreSchema);
            }

            
foreach (SkinType st in (SkinType[])System.Enum.GetValues(typeof(SkinType)))
            
{
                toolMenu.DropDownItems.Add(
new ToolStripMenuItem(st.ToString()));
                toolMenu.DropDownItems[toolMenu.DropDownItems.Count 
- 1].Click += new EventHandler(frm_Main_Click);
                
if (st.ToString() == skin.Tables[0].Rows[0][0].ToString())
                
{
                    ((ToolStripMenuItem)toolMenu.DropDownItems[toolMenu.DropDownItems.Count 
- 1]).Checked = true;
                    frm_Main_Click(toolMenu.DropDownItems[toolMenu.DropDownItems.Count 
- 1], null);
                }

            }

            toolMenu.DropDownItems.Add(
new ToolStripMenuItem("系统默认"));
            toolMenu.DropDownItems[toolMenu.DropDownItems.Count 
- 1].Click += new EventHandler(frm_Main_Click);
            
if (skin.Tables[0].Rows[0][0].ToString() == "系统默认")
            
{
                ((ToolStripMenuItem)toolMenu.DropDownItems[toolMenu.DropDownItems.Count 
- 1]).Checked = true;
            }

        }

        
static void frm_Main_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;
                    DataSet skin 
= new DataSet();
                    skin.Tables.Add(
"skin");
                    skin.Tables[
"skin"].Columns.Add("style");
                    System.Data.DataRow dr 
= skin.Tables["skin"].NewRow();
                    dr[
0= ((ToolStripMenuItem)((ToolStripMenuItem)sender).OwnerItem).DropDownItems[i].Text;
                    skin.Tables[
0].Rows.Add(dr); skin.WriteXml("skin.xml", XmlWriteMode.IgnoreSchema);
                }

                
else
                
{
                    ((ToolStripMenuItem)((ToolStripMenuItem)((ToolStripMenuItem)sender).OwnerItem).DropDownItems[i]).CheckState 
= CheckState.Unchecked;
                }

            }

            
if (((ToolStripMenuItem)sender).Text == "系统默认")
            
{
                RemoveSkin(); DataSet skin 
= new DataSet();
                skin.Tables.Add(
"skin"); skin.Tables["skin"].Columns.Add("style");
                System.Data.DataRow dr 
= skin.Tables["skin"].NewRow();
                dr[
0= "系统默认"; skin.Tables[0].Rows.Add(dr);
                skin.WriteXml(
"skin.xml", XmlWriteMode.IgnoreSchema);
                
return;
            }

            
foreach (SkinType st in (SkinType[])System.Enum.GetValues(typeof(SkinType)))
            
{
                
if (st.ToString() == ((ToolStripMenuItem)sender).Text)
                
{
                    ChangeSkin(st);
                    
return
                }
 
            }

        }

        
/// 改变皮肤 ///
        public static void ChangeSkin(SkinType st)
        
{
            System.Reflection.Assembly thisDll 
= System.Reflection.Assembly.GetExecutingAssembly();
            
if (se == null
            
{
                
//TestSkin是指命名空间,这里你可以换成你自己的。
                se = new Sunisoft.IrisSkin.SkinEngine(Application.OpenForms[0], thisDll.GetManifestResourceStream("TestSkin.skin." + st.ToString() + ".ssk"));
                se.Active 
= true;
                
for (int i = 0; i < Application.OpenForms.Count; i++)
                
{
                    se.AddForm(Application.OpenForms[i]);
                }
 
            }

            
else 
            
{
                
//TestSkin是指命名空间,这里你可以换成你自己的。
                se.SkinStream = thisDll.GetManifestResourceStream("TestSkin.skin." + st.ToString() + ".ssk");
                se.Active 
= true;
            }

        }

        
/// 移除皮肤 ///
        public static void RemoveSkin()
        
{
            
if (se == nullreturn; }
            
else { se.Active = false; }
        }

    }

    
/// 换肤类型 ///
    public enum SkinType
    
{
        Calmness, DeepCyan, Eighteen, Emerald, GlassBrown, Longhorn, MacOS, Midsummer, MP10, MSN, OneBlue, Page, RealOne, Silver, SportsBlack, SteelBlack, vista1, Vista2, Warm, Wave, XPSilver
    }
 
}

4:调用 在你的主窗体里加上一个MenuStrip菜单,建一个2级菜单(如:文件→更换皮肤),然后在Form_Load事件里写上调用代码:

private   void  Form1_Load( object  sender, EventArgs e) 
{
         
//“更换皮肤ToolStripMenuItem” 是上面例子里“更换皮肤”这个ToolStripMenuItem的Name。
        SkinClass.AddSkinMenu(更换皮肤ToolStripMenuItem); 
}
 

5:注 以下两个方法是主要换肤用的: ChangeSkin方法换肤 RemoveSkin方法恢复系统默认皮肤 大家可以不用直接给单独一个窗体换肤。我以上的代码是生成一个换肤菜单,然后所有的窗体都是自动进行换肤了。

问题讨论:加载皮肤文件后,有些提示框会无法正确显示。(具体错误是:caption属性字符串长度过长)。修改这个Bug的方法是在SkinEngin属性中有个Dialog属性,我们将其设置为False即可。这样我们可以不对Dialog进行添加皮肤。

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值