《锐视开源测控平台技术文章》

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

在平常的项目需求中,除了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 = value; this.Invalidate(); }

            get { return isCheck; }

        }
        public enum CheckStyle

        {

            style1 ,

            style2 ,

            style3 ,

            style4 ,

        };

        CheckStyle checkStyle = CheckStyle.style1;

        /// <summary>

        /// 样式

        /// </summary>

        public CheckStyle CheckStyleX

        {

            set { checkStyle = value; this.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、重新绘制图片

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

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

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

4.       可以生成对应的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#

SeeSharp Ecosystem

联系简仪

更多信息,请致电简仪科技:021-50475899                            官网:www.jytek.com                                                     Email: info@jytek.com

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