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

C# 轻松实现对窗体(Form)换肤 (转) 转载效果不是很好,请到http://www.csharpwin.com/csharpresource/2992.shtml浏览详细  一直想写一个比较完整的、容易扩展的窗体换肤的方案,由于时间问题,都没去实现这个想法。现在有朋友提出需要,就把以前写的重新拿出来看了一篇,花了些时间,做出了现在的这个换肤的方案。实现的过程中遇到了不少问题,但还是解决了,虽然也许还有些缺陷,但也算是比较完善 阅读详情

http://www.csharpwin.com/csharpresource/2992.shtml


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

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



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

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

2、  为了使Form可以像标准的Windows窗体那样拥有系统菜单和拖动改变窗体大小,加入WS_THICKFRAME和WS_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的完整代码:

public abstract class SkinFormRenderer
    {
        #region Fields
        private EventHandlerList _events;
        private static readonly object EventRenderSkinFormCaption = new object();
        private static readonly object EventRenderSkinFormBorder = new object();
        private static readonly object EventRenderSkinFormBackground = new object();
        private static readonly object EventRenderSkinFormControlBox = new object();
        #endregion
        #region Constructors
        protected SkinFormRenderer()
        {
        }
        #endregion
        #region Properties
        protected EventHandlerList Events
        {
            get
            {
                if (_events == null)
                {
                    _events = new EventHandlerList();
                }
                return _events;
            }
        }
        #endregion
        #region Events
        public event SkinFormCaptionRenderEventHandler RenderSkinFormCaption
        {
            add { AddHandler(EventRenderSkinFormCaption, value); }
            remove { RemoveHandler(EventRenderSkinFormCaption, value); }
        }
        public event SkinFormBorderRenderEventHandler RenderSkinFormBorder
        {
            add { AddHandler(EventRenderSkinFormBorder, value); }
            remove { RemoveHandler(EventRenderSkinFormBorder, value); }
        }
        public event SkinFormBackgroundRenderEventHandler RenderSkinFormBackground
        {
            add { AddHandler(EventRenderSkinFormBackground, value); }
            remove { RemoveHandler(EventRenderSkinFormBackground, value); }
        }
        public event SkinFormControlBoxRenderEventHandler RenderSkinFormControlBox
        {
            add { AddHandler(EventRenderSkinFormControlBox, value); }
            remove { RemoveHandler(EventRenderSkinFormControlBox, value); }
        }
        #endregion
        #region Public Methods
        public abstract Region CreateRegion(SkinForm form);
        public abstract void InitSkinForm(SkinForm  form);
        public void DrawSkinFormCaption(
            SkinFormCaptionRenderEventArgs e)
        {
            OnRenderSkinFormCaption(e);
            SkinFormCaptionRenderEventHandler handle =
                Events[EventRenderSkinFormCaption]
                as SkinFormCaptionRenderEventHandler;
            if (handle != null)
            {
                handle(this, e);
            }
        }
        public void DrawSkinFormBorder(
            SkinFormBorderRenderEventArgs e)
        {
            OnRenderSkinFormBorder(e);
            SkinFormBorderRenderEventHandler handle =
                Events[EventRenderSkinFormBorder]
                as SkinFormBorderRenderEventHandler;
            if (handle != null)
            {
                handle(this, e);
            }
        }
        public void DrawSkinFormBackground(
            SkinFormBackgroundRenderEventArgs e)
        {
            OnRenderSkinFormBackground(e);
            SkinFormBackgroundRenderEventHandler handle =
                Events[EventRenderSkinFormBackground]
                as SkinFormBackgroundRenderEventHandler;
            if (handle != null)
            {
                handle(this, e);
            }
        }
        public void DrawSkinFormControlBox(
            SkinFormControlBoxRenderEventArgs e)
        {
            OnRenderSkinFormControlBox(e);
            SkinFormControlBoxRenderEventHandler handle =
                Events[EventRenderSkinFormControlBox]
                as SkinFormControlBoxRenderEventHandler;
            if (handle != null)
            {
                handle(this, e);
            }
        }
        #endregion
        #region Protected Render Methods
        protected abstract void OnRenderSkinFormCaption(
            SkinFormCaptionRenderEventArgs e);
        protected abstract void OnRenderSkinFormBorder(
            SkinFormBorderRenderEventArgs e);
        protected abstract void OnRenderSkinFormBackground(
            SkinFormBackgroundRenderEventArgs e);
        protected abstract void OnRenderSkinFormControlBox(
            SkinFormControlBoxRenderEventArgs e);
        #endregion
        #region Protected Methods
        [UIPermission(SecurityAction.Demand, Window = UIPermissionWindow.AllWindows)]
        protected void AddHandler(object key, Delegate value)
        {
            Events.AddHandler(key, value);
        }
        [UIPermission(SecurityAction.Demand, Window = UIPermissionWindow.AllWindows)]
        protected void 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。


SkinForm皮肤包 立即下载

相关推荐

SkinForm源码(C#),仿QQ的必备皮肤控件

反编译的SKinForm源码,能正常编译,可修改之后重新打包编译

(转)教你实现Winform窗体的四边阴影效果

1.首先我们得有这样一张阴影图片。 2.然后分别有两个窗体去实现这个阴影效果。 SkinForm - 用于实现阴影的绘制,特性:鼠标可穿透,无法点击,跟随窗体。 SkinMain - 主窗体,也是承载控件的容器窗体, 特性:与普通窗体无一区别,移动和拉伸,阴影窗体都会跟随。 3.在SkinMain主窗体的OnVisibl...

weixin_30919919的博客 586

C#界面美化 (最好用的免费的第三方控件控件库)

C#做界面美化用的。最好的免费的控件库,无使用限制,非常好用!你值得拥有!!! 超好用的免费C#第三方控件!它将为您的WinForm界面画龙点晴哦! 这是2016年的最新版的哦,支持.net2.0及.net2.0以上

C#自定义窗口

本文转载:http://www.cnblogs.com/jingmoxukong/p/4843776.html [C#]绘制自定义窗体 目录 去windows除边框标题栏标题栏的相关事件绘制边框绘制阴影 参考资料 回到顶部 去windows除边框 初始窗口样式: 将窗口FormBorderStyle属性设为None,就可以去除四周边框

知其所以然 8678

STM32驱动HC-SR04超声波模块:两种精准测距方案详解

本文详解STM32驱动HC-SR04超声波模块的两种精准测距方案:定时器中断计数法和外部中断边沿检测法。涵盖硬件连接、代码实现与优化技巧,帮助开发者根据精度和复杂度需求选择合适方案,提升超声波测距在嵌入式项目中的稳定性和准确性。

g5h6i的博客 683

PyCharm配置及使用Git教程

平时习惯在Windows下开发,但是我们又需要实时将远方仓库的代码clone到本地,也需要将自己修改的代码push到远端服务器。

酒酿小圆子呀~ 4万+

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

C# 轻松实现对窗体(Form)换肤 2009-09-25 来自:CS 程序员之窗 摘要:C#实现对窗体(Form)换肤,实现漂亮的个性化窗体,通过继承SkinFormRenderer,可以轻松实现自己喜欢的各种窗体风格,换肤后的窗体与标准的Windows窗体保持一样的功能,如:拥有系统菜单,拖动改变窗体大小等。 一直想写...

weixin_33700350的博客 375

大疆mini 3 pro rtmp推流(带屏遥控器不支持)windows

大疆mini 3 pro无人机rtmp推流(带屏遥控器不支持)至windows电脑

xbsigeibwkouvfcj的博客 3430

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

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

weixin_34270865的博客 123

模电学习笔记(十二)——跨阻放大器

模电学习笔记(十二) 跨阻放大器 跨组运算放大器是将电流信号转换成为电压信号,电流到电压增益基于反馈电阻。 设计目标: 输入 输出 带宽 电源 0A 100uA 0V 7V 20kHz 15V -15V 1.计算R1的值(增益电阻器) 2.计算C1的值满足电路带宽 ...

tang11081023的博客 2万+

FastBuilding 3DMAX插件:批量生成配楼,让建筑可视化告别手动重复建模

在建筑可视化与城市规划项目中,配楼群是营造城市氛围和方案完整度的关键,但几十上百栋配楼的建模往往成为工期瓶颈。传统复制粘贴或BOX贴图方式无法兼顾真实感与效率。FastBuilding作为一款3DMAX插件,通过参数化生成逻辑,将配楼制作转化为可调控的流水线:设定层高、面宽、窗户密度等参数,即可在视口内实时生成带完整外立面细节的实体模型;支持点选拉框和样条线批量生成两种模式,配合随机种子可快速产出丰富而不失协调的建筑群。该插件不仅面数控制合理,生成模型仍可继续编辑,尤其适合住宅区鸟瞰、规划投标及远景天际线等

weixin_28520495的博客 251

C# Winform中窗体的美化—— 用IrisSkin轻松实现换肤功能

今天经前辈提醒才知道winform窗体还有美化工具,呵呵,不得不说,孤陋寡闻了。下面总结一下irisskin2的使用步骤和遇到的问题及解决办法。 1、网址:http://www.pc6.com/softview/SoftView_70918.html#download 皮肤控件换肤素材包,IrisSkin2.dll皮肤素材资源下载,这是一款与编程开发相关的素材资源,主要是提供一些采用Iris...

weixin_30332705的博客 159

别再只调PID了!手把手教你从LC谐振到检波,搞定STM32智能车电磁循迹硬件电路

本文深入解析STM32智能车电磁循迹硬件电路设计,从LC谐振选频到数字信号处理,提供完整的信号链路设计要点与实战技巧。通过优化电磁杆布局和信号放大电路,显著提升赛道位置检测精度,误差可控制在±0.5cm以内,为智能车竞赛提供可靠硬件支持。

weixin_29220405的博客 263

C#窗体换肤

Form1.cs using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace...

weixin_30532837的博客 165

【SpringBoot 3.x 第92节】Spring Modulith:构建模块化单体架构(基于 Spring Boot 3),一文带你搞透(超详细)!

🏆本文收录于《滚雪球学SpringBoot 3.x》,专门攻坚指数提升,本年度国内最系统+最专业+最详细(永久更新)。    该专栏致力打造最硬核 SpringBoot3 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot3教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。

**My Coding Family** 999

YOLOv11改进 | 损失函数改进篇 | 2024最新高质量的目标检测边界框回归损失Unified-IoU、FocalUIoU、FocalInvUIoU(设置动态epoch参数)

本文给大家带来的改进机制是最近新提出的高质量的目标检测边界框回归损失,其通过动态调整模型对不同质量预测框的关注,优化目标检测中的边界框回归精度。UIoU引入了FocalBox方法,通过缩放预测框与真实框分配权重,并采用了退火策略(引入动态参数epoch),逐渐将模型的注意力从低质量预测框转移到高质量预测框,平衡了训练速度与检测精度。其还有一定的解决样本不平衡问题,同时该损失函数可以和现有的任何边界框回归损失函数进行结合,例如ShapeIoU和其结合可以形成二次创新,它是一种类似于之前的Inner的机制.

Snu77的博客 4585

C# 给窗体添加皮肤-SkinEngine的应用

 我在网上搜索过,给窗体使用皮肤的方法有很多,不过C#中这种方法最简单。 利用 IrisSkin2.dll 所提供的控件 SkinEngine 来为窗体添加皮肤。 具体步骤: 1.添加控件SkinEngine。   1.右键“工具箱”。“添加选项卡”,取名“皮肤”。   2.右键“皮肤”,“选择项”弹出对话框。   3.点击“浏览“,找到IrisSkin2.dll,这时你会

zzhywhp的专栏 2165

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: FineUI v3.2.5 发布了!(支持IE10)
下一篇: c# ocr组件逐个说说
江南野鹤
博客等级 码龄23年 54粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值