http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 5018|回复: 0

[学习交流] 对窗体Form换肤

[复制链接]
发表于 2013-10-26 12:31:22 | 显示全部楼层 |阅读模式
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的完整代码:[code=csharp]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

    }[/code]

在项目中实现了SkinFormProfessionalRenderer类,这个类实现了类似QQ2008的窗体的绘制,效果就是文章开始那贴出来的图了。还有一些其他辅助功能的类就不一一介绍了,接下来有时间,我会实现一个SkinFormImageRenderer绘制类,敬请大家关注。
声明:
本文版权归作者和CS 程序员之窗所有,欢迎转载,转载必须保留以下版权信息,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
作者:Starts_2000


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-23 01:41

© 2014-2021

快速回复 返回顶部 返回列表