制作可自定义风格的winform组件类(四)简单按钮

实际上这并不是一个按钮,只是一个变换背影图层而已,但通过过滤背景色,它实现了按钮的不规则形态,例如最常见的圆角风格,下面是代码

namespace CDTheme
{
    public abstract partial class CDBaseImage : CDBase
    {
        private Image _normalImage;
        private Image _disabledImage;

        public CDBaseImage()
        {
            InitializeComponent();
        }

        [Browsable(false)]
        public override Image BackgroundImage
        {
            get
            {
                return base.BackgroundImage;
            }
            set
            {
                base.BackgroundImage = value;
            }
        }

        public Image NormalBackImage
        {
            get
            {
                return _normalImage;
            }
            set
            {
                _normalImage = value;
                BackImageChanged();
            }
        }
        public Image DisabledBackImage
        {
            get
            {
                return _disabledImage;
            }
            set
            {
                _disabledImage = value;
                BackImageChanged();
            }
        }
        public Image MouseMoveBackImage { get; set; }
        public Image MouseDownBackImage { get; set; }

        private void BackImageChanged()
        {
            if (!CDEvent.HasFlag(CDControlEvent.BackImage))
                return;
            if (Enabled)
            {
                if (CDState.HasFlag(CDControlState.MouseDown))
                {
                    if (MouseDownBackImage != null)
                        BackgroundImage = MouseDownBackImage;
                }
                else if (CDState.HasFlag(CDControlState.MouseEnter))
                {
                    if (MouseMoveBackImage != null)
                        BackgroundImage = MouseMoveBackImage;
                }
                else
                {
                    if (NormalBackImage != null)
                        BackgroundImage = NormalBackImage;
                }
            }
            else
            {
                BackgroundImage = DisabledBackImage == null ? NormalBackImage : DisabledBackImage;
            }
        }

        protected override void StateChanged(CDControlState changedState, bool allow)
        {
            base.StateChanged(changedState, allow);
            BackImageChanged();
        }
    }
}

显然你看到了abstract关键字,这说明这个类只是封装了背景变换的相关属性和功能实现,但却不能直接使用,这是因为更多的复杂控件需要以它来派生,为了能实现简单按钮的功能,又有了下面这个真正可以在IDE中显示并使用的winform组件

namespace CDTheme
{
    [ToolboxItem(true)]
    [DefaultEvent("Click")]
    public partial class CDBackImage : CDBaseImage
    {
        public CDBackImage()
        {
            SetCDControlEvent(CDControlEvent.BackImage | CDControlEvent.MouseClick | CDControlEvent.MouseMove, true);
            InitializeComponent();
            DesigntimeSkinLoad("CDBackImage");
        }
    }
}

ToolboxItemAttribute特性决定了这个组件将显示在工具窗口中

DefaultEventAttribute特性决定了这个组件的默认事件,也就是我们在IDE窗口中双击时的事件

SetCDControlEvent方法决定了这个组件所响应的需求,在父类的StateChanged方法中完成了需求的功能,也就是背景变化

DesigntimeSkinLoad方法是在设计时装载已定义的组件皮肤的,这个示例没有内容会单独用一篇内容来阐述

在父类中,在NormalBackImage和DisabledBackImage属性的set方法中调用了BackImageChanged方法,目的是在设计时能够在IDE中体现背景变化的效果

演示一下吧,在设计器上建一个窗口,把此控件拖进来,NormalBackImage、DisabledBackImage、MouseMoveBackImage和MouseDownBackImage属性上设计对应的图片后,这个示例程序就做好了,效果图如下

后话,只是一个变换背影的小功能是用不着写这么多代码的,这只是一个示例,更多复杂和漂亮的功能,在以后会为大家展示

时间: 2024-11-09 05:26:46

制作可自定义风格的winform组件类(四)简单按钮的相关文章

制作可自定义风格的winform组件类(二)知识要点总结

本文不断补充中,这全都是浪费了我很多时间才走过的坎 一.继承关系. 所有自定义的控件都继承自UserControl,当然你也可以直接从标准的winform控件中派生新类,但这样生出来的控件不能在设计时使用,所以还是得规规矩矩的按.NET给定的路线走.UserControl继承于标准控件的基类Control,使得用户自定义的控件与标准控件在运行时没有任何差别,但在设计时却有很大的不同,有些属性被override后不起作用,似乎是IDE认准了原来属性的get和set方法,对策就是隐藏这个属性,然后用

制作可自定义风格的winform组件类(一)准备工作

首先要明确目的,就是这组控件打算做成什么样子,都有哪些功能.我的计划如下: 一.公共的控件类,并且方便扩展 二.控件的外观素材与控件本身分离,并使外观效果更易于更新替换 三.支持一鍵换肤功能,这包括运行时与设计时 四.做一个控件皮肤风格设计器并支持多种部署方案 准备所需要的内容: 一.VS2013(废话) 二.一套默认的控件皮肤,本人的平面设计能力基本为零,所以一定是在网上摘来的,很无奈,大部分素材都是为web而生,应用在winform上总是少一种状态 三.基于上一点,所以又下载了中文PS,妄想

制作可自定义风格的winform组件类(三)基类

一个良好的基类能决定这个控件能走多远,那么下面来定义一些事情. 定义状态,表示控件当前处于哪种状态,用来区别对同一事件作出不同的响应 [Flags] public enum CDControlState { None = 0, SkinLoaded = 1, MouseEnter = 2, MouseDown = 4, Resizing = 8, } 定义事件,用来定制需求,忽略无用的代码,以免造成过多响应或是窗口重绘 [Flags] public enum CDControlEvent { N

extjs自定义组件类

在使用extjs开发应用系统时,难免会出现一个js文件内包含数百行甚至上千行代码的情况,例如程序主界面或者复杂一点的界面,下面介绍如何通过自定义组件减少单个extjs javascript代码行数的方法. 下图中的主界面显示了两个统计图: 最初的时候统计图的js代码是写死在tagpanel里面的,通过extjs 自定义组件的方法拆分成单独的类文件以后的代码: Ext.define('app.view.main.Main_Pie_Chart', { extend: 'Ext.panel.Panel

制作c#安装程序/使用安装服务类自定义安装事件

第一步:建立工程 1.打开vs,新建项目->其他项目类型->安装和部署(),新建安装项目,命名为SetupTest. 2.新建工程后,可以在“解决方案资源管理器”里面看到子项:文件系统编辑器,注册表编辑器,文件类型编辑器,用户界面编辑器,自定义操作编辑器,启动条件编辑器.下面将会举例来说明各个地方怎么使用. 3.最简单的一个安装程序:点击“文件类型编辑器”,找到“应用程序文件夹”,添加->文件,选择你要打包的程序文件(譬如我的程序有run.exe和lib.dll组成),确定.在项目“Se

使用CSS3 制作一个material-design 风格登录界面

使用CSS3 制作一个material-design 风格登录界面 心血来潮,想学学 material design 的设计风格,就尝试完成了一个登录页面制作. 这是整体效果. 感觉还不错吧,结尾会附上代码 在编写的过程中,没有使用任何图片或者字体图标,全部使用css3完成,还是遇到一些难点和bug,所以想笔记下来,以后方便查阅. 响应式设计 在这个页面中,使用下面3点来完成响应式设计 最大宽度 .设定了一个 max-width 的最大宽度,以便在大屏幕时兼容. margin : 20px au

c# Menu和ContextMenu自定义风格简单实现

为了实现自定义的Menu和ContextMenu效果,可以通过派生ProfessionalColorTable类,在自定义类中通过重写ProfessionalColorTable类的相关属性,产生自定义菜单效果. using System.Drawing; using System.Windows.Forms; public class CustomToolStripColorTable : ProfessionalColorTable {     /// <summary>     /// 

react组件 -- React.createClass()方法--同时创建多个组件类

<!DOCTYPE html><html> <head> <script src="../build/react.js"></script> <script src="../build/react-dom.js"></script> <script src="../build/browser.min.js"></script> </h

Qt之模型/视图(自定义风格)

Qt之模型/视图(自定义风格) 关于自定义风格是针对视图与委托而言的,使用事件与QSS都可以进行处理,今天关于美化的细节讲解一下. 先看下图: 先撇开界面的美观性(萝卜青菜,各有所爱),就现有的这些风格,使用QSS + Qt二维绘图已经绰绰有余了.当然,如何让界面更美观,这个没有什么捷径,我只能说一句:无他,唯手熟尔!基本功搞扎实了,实现起来就会游刃有余...void DetailProgressBar::paint(QPainter *painter, const QStyleOptionVi