▋需求描述

在平常的项目需求中,除了C#本身自带的一些控件,我们可能还需要更多的自定义性质的控件,那么如何去创建一个自定的控件,就是我们需要讨论的问题。


▋关键词

自定义控件,C#,测试测量界面


▋应用详述:


当我们在网上免费资源中获得一些比较精美的图片,希望将其制作成做希望控件,需要如何操作呢?

1.首先我们有了如下按钮图片,如图1所示。

图1 按钮图片


  建立一个C#窗体应用程序,主窗体起名为JYSwitchDemo,向解决方案中再加入一个用户控件,起名为JYSwitch。

图2 解决方案资源管理



2.控件做好后,会出现在【工具箱】内

图3 在工具箱的显示


  修改JYSwitch.cs的代码

   a.修改构造函数

      这些属性修改基本上都是常规套路模式,是为刷新方便而启用的。所以在使用过程中直接复制和粘贴就可以。

        public JYSwitch()

        {

            InitializeComponent();

 

            //设置Style支持透明背景色并且双缓冲

            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);

            this.SetStyle(ControlStyles.DoubleBuffer, true);

            this.SetStyle(ControlStyles.ResizeRedraw, true);

            this.SetStyle(ControlStyles.Selectable, true);

            this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);

            this.SetStyle(ControlStyles.UserPaint, true);

            this.BackColor = Color.Transparent;

            //鼠标移动到控件时变成手型

            this.Cursor = Cursors.Hand;

            //初始生成时候的大小

            this.Size = new Size(87, 27);

            //注册控件单击事件

            this.Click += new System.EventHandler(this.JYSwitch_Click);

    }


   b.添加自定义属性

      在JYSwitch的类中,添加两种属性

      第一个属性是:是否被选中(Checked)

      第二个是:Switch显示样式 (CheckStyleX)

      添加下面的代码:

        bool isCheck = false;

        /// <summary>

        /// 是否选中

        /// </summary>

        public bool Checked

        {

            set { isCheck = valuethis.Invalidate(); }

            get { return isCheck; }

        }
        public enum CheckStyle

        {

            style1 ,

            style2 ,

            style3 ,

            style4 ,

        };

        CheckStyle checkStyle = CheckStyle.style1;

        /// <summary>

        /// 样式

        /// </summary>

        public CheckStyle CheckStyleX

        {

            set { checkStyle = valuethis.Invalidate(); }

            get { return checkStyle; }

    }


   c.添加自定义事件

      添加一个事件就是checked值改变事件,添加如下的代码:


        /// <summary>

        /// 事件

        /// </summary>

        public event EventHandler CheckChanged;

        /// <summary>

        /// 单机按钮事件

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void JYSwitch_Click(object sender, EventArgs e)

        {

            isCheck = !isCheck;

            this.Invalidate();

            //这个需要在外部去定义才可以使用,这才是真正的内容

            if (CheckChanged != null)

            {

                //TODO

                CheckChanged(sender, e);

            }

        }


      这边调用本身的Click事件,如果我们在MainForm程序中注册了CheckChanged则会发出该事件,否则不会发出该事件。

  

   d.重新绘制图片

    · 首先将我们准备的好的图片导入到项目程序当中,点击Resources.resx

    · 进入后添加资源→添加现有文件

    · 选择已有图片,如图X所示。

     · 以生成对应的Resources.Deisgner.cs,并查看其命名控件的内容

图4 导入图片到资源管理中


   e.重载函数OnPaint,就是重新改变画图函数

        protected override void OnPaint(PaintEventArgs e)

        {

            Bitmap bitMapOn = null;

            Bitmap bitMapOff = null;

            if (checkStyle == CheckStyle.style1)

            {

                bitMapOn = global::JYSwitchDemo.Properties.Resources.垂直开;

                bitMapOff = global::JYSwitchDemo.Properties.Resources.垂直关;

            }

            else if (checkStyle == CheckStyle.style2)

            {

                bitMapOn = global::JYSwitchDemo.Properties.Resources.垂直开2;

                bitMapOff = global::JYSwitchDemo.Properties.Resources.垂直关1;

            }

            else if (checkStyle == CheckStyle.style3)

            {

                bitMapOn = global::JYSwitchDemo.Properties.Resources.按钮开;

                bitMapOff = global::JYSwitchDemo.Properties.Resources.按钮关;

            }

            else if (checkStyle == CheckStyle.style4)

            {

                bitMapOn = global::JYSwitchDemo.Properties.Resources.水平开;

                bitMapOff = global::JYSwitchDemo.Properties.Resources.水平关;

            }

            Graphics g = e.Graphics;

            Rectangle rec = new Rectangle(0, 0, this.Size.Width, this.Size.Height);

            if (isCheck)

            {

                g.DrawImage(bitMapOn, rec);

            }

            else

            {

                g.DrawImage(bitMapOff, rec);

            }

        }


3.测试代码程序

      编写完自定义控件之后进行编译,会在工具栏之后出现我们所做的自定义控件。将其拖出来。同时可以看见,控件的属性窗口和事件窗口中出现我们添加的属性和事件。

图5 测试开关按钮



图6 按钮属性以及事件


      只要改变属性中CheckstyleX就可以修改我们按钮开关的样式了,十分方便!同时,可以将项目中输出类型进行改变,只要改变到类库输出,那么我就可以生成我们想要的dll,在其他程序中也可以使用了。

图7

手把手教你C#与MATLAB混合编程 (上)
视频教学-锐视开发软件培训

上一篇

下一篇

手把手教你制作第一个C#控件

本网站由阿里云提供云计算及安全服务