C# 轻松实现对窗体(Form)换肤

摘要:
现在只实现了具有完整代码绘图的SkinFormProfessionalRenderer。接下来,我们将在有时间实现皮肤变化时编写一个SkinFormImageRender,只要我们做好图片。看到效果后,让我们看看SkinForm的实现原理:1.将Form设置为没有标题栏的窗口。接下来,我们将介绍表单绘制类SkinForRenderer,这是一个重要的类。这是一个抽象类。通过重写其中的绘图方法,可以获得新的窗体外观。此类中有几个抽象方法:1.CreateRegion:创建一个区域供SkinForm使用。

打下广告:窗体换肤高级版本可以从这里获取。高级版本可以实现XML文件更换皮肤、实现了用图片绘制皮肤。

    一直想写一个比较完整的、容易扩展的窗体换肤的方案,由于时间问题,都没去实现这个想法。现在有朋友提出需要,就把以前写的重新拿出来看了一篇,花了些时间,做出了现在的这个换肤的方案。实现的过程中遇到了不少问题,但还是解决了,虽然也许还有些缺陷,但也算是比较完善了。现在只实现了完全代码绘制的SkinFormProfessionalRenderer,接下来有时间会写一个SkinFormImageRenderer,实现只要做好图片就可以换肤。

在这先里发一下牢骚,最近看到很多网站转载了截图控件那几篇文章,但是版权声明、作者信息都去掉了,说实话,心里很不爽,这些文章和代码都是我辛辛苦苦的花了不少时间写出来的,我也没有不允许转载,但是你转载的时候为什么还要把作者信息去掉呢,请你尊重一下作者的劳动好吗?发完牢骚,先来看一下窗体换肤后的效果吧。

C# 轻松实现对窗体(Form)换肤第1张

C# 轻松实现对窗体(Form)换肤第2张

看完效果,来看看SkinForm的实现原理:

1、  Form设置为无标题栏窗口。

2、  为了使Form可以像标准的Windows窗体那样拥有系统菜单和拖动改变窗体大小,加入WS_THICKFRAMEWS_SYSMENU窗体样式。

3、  处理相应得窗体消息,实现窗体的标准操作。

4、  实现SkinFormRenderer,绘制窗体的标题栏、边框、按钮等。

 

原理只做简单介绍,要详细说明,那得写很多东西了,介绍一下SkinForm中加入的几个属性的功能:

1、  BorderWidth,设置或获取窗体的边框的宽度。

2、  CanResize:设置或获取窗体是否可以改变大小。

3、  CaptionFont:设置或获取窗体标题的字体。

4、  CapntionHeight:设置或获取窗体标题栏的高度。

5、  CloseBoxSize:设置或获取关闭按钮的大小。

6、  MinimizeBoxSize:设置或获取最小化按钮的大小。

7、  MaximizeBoxSize:设置或获取最大化(还原)按钮的大小。

8、  ControlBoxOffset:设置或获取控制按钮的偏移。

9、  ControlBoxSpace:设置或获取控制按钮的间距。

10、RoundStyle:设置或获取窗体的圆角样式。

11、   Radius:设置或获取窗体的圆角的大小。

12、   Renderer:设置或获取窗体的绘制方法。

接下来介绍窗体的绘制类SkinFormRenderer,这是比较重要的类,它是一个抽象类,重写它里面的绘制方法,就可以得到新的窗体皮肤。这个类里面主要有几个抽象方法:

1、  CreateRegion:创建一个Region,提供给SkinForm使用。

2、  OnRenderSkinFormCaption:绘制窗体标题栏。

3、  OnRenderSkinFormBorder:绘制窗体边框。

4、  OnRenderSkinFormBackground:绘制窗体背景。

5、  OnRenderSkinFormControlBox:绘制窗体控制按钮(最小化、最大化、关闭);

看看SkinFormRenderer的完整代码:

publicabstractclass SkinFormRenderer
  
...{

C# 轻松实现对窗体(Form)换肤第3张      Fields#region Fields
     
private EventHandlerList _events;
     
privatestaticreadonlyobject EventRenderSkinFormCaption =newobject();
     
privatestaticreadonlyobject EventRenderSkinFormBorder =newobject();
     
privatestaticreadonlyobject EventRenderSkinFormBackground =newobject();
      
privatestaticreadonlyobject EventRenderSkinFormControlBox =newobject();
    
#endregion

C# 轻松实现对窗体(Form)换肤第3张   
Constructors#region Constructors
    
protected SkinFormRenderer()
   
...{

    }

    
#endregion

C# 轻松实现对窗体(Form)换肤第3张    
Properties#region Properties
    
protected EventHandlerList Events
  
...{
         
get

        
...{

          
if (_events ==null)

           
...{

                 _events
=new EventHandlerList();

               }


           
return _events;

        }


     }

    
#endregion

C# 轻松实现对窗体(Form)换肤第3张    
Events#region Events
 
publicevent SkinFormCaptionRenderEventHandler RenderSkinFormCaption
   
...{

        add
...{ AddHandler(EventRenderSkinFormCaption, value); }

        remove
...{ RemoveHandler(EventRenderSkinFormCaption, value); }

      }

   
publicevent SkinFormBorderRenderEventHandler RenderSkinFormBorder
    
...{

          add
...{ AddHandler(EventRenderSkinFormBorder, value); }

       remove
...{ RemoveHandler(EventRenderSkinFormBorder, value); }

     }

   
publicevent SkinFormBackgroundRenderEventHandler RenderSkinFormBackground
 
...{

      add
...{ AddHandler(EventRenderSkinFormBackground, value); }

         remove
...{ RemoveHandler(EventRenderSkinFormBackground, value); }

     }


    
publicevent SkinFormControlBoxRenderEventHandler RenderSkinFormControlBox
    
...{

         add
...{ AddHandler(EventRenderSkinFormControlBox, value); }

        remove
...{ RemoveHandler(EventRenderSkinFormControlBox, value); }

    }

  
#endregion

C# 轻松实现对窗体(Form)换肤第3张   
Public Methods#region Public Methods
 
publicabstract Region CreateRegion(SkinForm form);
   
publicabstractvoid InitSkinForm(SkinForm  form);
 
publicvoid DrawSkinFormCaption(SkinFormCaptionRenderEventArgs e)

    
...{

         OnRenderSkinFormCaption(e);

       SkinFormCaptionRenderEventHandler handle
=

            Events[EventRenderSkinFormCaption]

         
as SkinFormCaptionRenderEventHandler;

    
if (handle !=null)

        
...{

             handle(
this, e);

       }


   }

 
publicvoid DrawSkinFormBorder(SkinFormBorderRenderEventArgs e)
  
...{

       OnRenderSkinFormBorder(e);

         SkinFormBorderRenderEventHandler handle
=

            Events[EventRenderSkinFormBorder]

            
as SkinFormBorderRenderEventHandler;

      
if (handle !=null)

      
...{

             handle(
this, e);
      }


     }


    
publicvoid DrawSkinFormBackground(SkinFormBackgroundRenderEventArgs e)

   
...{

        OnRenderSkinFormBackground(e);

        SkinFormBackgroundRenderEventHandler handle
=

           Events[EventRenderSkinFormBackground] 

           
as SkinFormBackgroundRenderEventHandler;

     
if (handle !=null)

      
...{

           handle(
this, e);

        }


     }

 
publicvoid DrawSkinFormControlBox(SkinFormControlBoxRenderEventArgs e)
   
...{

       OnRenderSkinFormControlBox(e);

     SkinFormControlBoxRenderEventHandler handle
=

         Events[EventRenderSkinFormControlBox]
       
as SkinFormControlBoxRenderEventHandler;

    
if (handle !=null)

      
...{

           handle(
this, e);

        }


    }

 
#endregion

C# 轻松实现对窗体(Form)换肤第3张   
Protected Render Methods#region Protected Render Methods
  
protectedabstractvoid OnRenderSkinFormCaption(SkinFormCaptionRenderEventArgs e);
  
protectedabstractvoid OnRenderSkinFormBorder(SkinFormBorderRenderEventArgs e);
  
protectedabstractvoid OnRenderSkinFormBackground(SkinFormBackgroundRenderEventArgs e);
 
protectedabstractvoid OnRenderSkinFormControlBox( SkinFormControlBoxRenderEventArgs e);
   
#endregion

C# 轻松实现对窗体(Form)换肤第3张    
Protected Methods#region Protected Methods
     [UIPermission(SecurityAction.Demand, Window
= UIPermissionWindow.AllWindows)]

    
protectedvoid AddHandler(object key, Delegate value)
     
...{

          Events.AddHandler(key, value);

     }




    [UIPermission(SecurityAction.Demand, Window
= UIPermissionWindow.AllWindows)]

    
protectedvoid RemoveHandler(object key, Delegate value)

    
...{

       Events.RemoveHandler(key, value);

     }

    
#endregion


}

在项目中实现了SkinFormProfessionalRenderer类,这个类实现了类似QQ2008的窗体的绘制,效果就是文章开始那贴出来的图了。还有一些其他辅助功能的类就不一一介绍了,接下来有时间,我会实现一个SkinFormImageRenderer绘制类,敬请大家关注。

声明:

本文版权归作者和CS 程序员之窗所有,欢迎转载,转载必须保留以下版权信息,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

作者:Starts_2000

出处:CS 程序员之窗 http://www.csharpwin.com

你可以免费使用或修改提供的源代码,但请保留源代码中的版权信息,详情请查看:

CS程序员之窗开源协议 http://www.csharpwin.com/csol.html

免责声明:文章转载自《C# 轻松实现对窗体(Form)换肤》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇二维码登录原理及生成与解析常用Java虚拟机参数下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Yii2.0 用户登录详解(上)

一、准备 在开始编写代码之前,我们需要思考一下:用户登陆模块,实现的是什么功能?很明显,是登陆功能,那么,登陆需要用户名和密码,我们在数据库的一张表中就应该准备好用户名和密码的字段,再思考一下,如果要实现自动登陆的功能,那么还需要什么?Cookie,是专门用于自动登陆的,所以,我们的数据表可能需要准备一个字段,专门用于储存客户端登陆所生成的cookie,这...

Delphi子窗体随主窗体大小而变化

当然办法有很多种,我建议用TRzsplitter更好点, TRzsplitter分割,在其上边放置panel,然后把align置为alClient,则可以随着主窗体的大小而一起变动 选中此控件右键editor Splitter,Orientation可以设置为水平分割或者垂直分割,其他属性自己摸索吧...

WinForm获取窗体关闭原因和是否取消关闭值

窗体关闭的原因有很多种,如用户关闭,关机,上层窗体关闭等。 窗体是否取消关闭的值为True时,窗体将不关闭。 而窗体关闭原因有什么用途呢?可以作为判断是否弹出“确认关闭窗体对话框”的条件,例如当关闭原因是用户关闭时弹出,而关闭原因是关机时不弹出。 以下代码将以对话框显示以上信息。 private void Form1_FormClosing(object...

JavaScript初学指南

目录: 包含与引入(Embedding,including) write 和 writeln 文档对象(document object) bgColor 和 fgColor 消息框(Message Box) 变量(Variables)和条件(Conditions) 函数(Function) onClick onLoad onUnload 表单(Form)...

C# winform 登陆成功打开主form,同时关闭登陆form

设置 Application.Run(new Form1());其中form1为主窗口,然后在form1的load方法里面这样写: 代码 private void Form1_Load(object sender, EventArgs e)         {             Form f2 = new Form2();            ...

【Android】图片(文件)上传的请求分析结构

  怎么在android中上传文件,即怎么用Java向服务器上传文件、上传图片,这是个老问题了,在网上能搜到现成的代码,很多朋友用起来也比较熟了,但是为什么这么写,可能很多朋友并不清楚,这篇文章就来分析一下Web中文件上传的请求包内容。如有问题请联系zhfch.class@gmail.com。   当然说,这篇文章被我冠了一个“Android”的前缀,因为...