zoukankan      html  css  js  c++  java
  • 简单制作自定义控件

      刚毕业,就是个菜鸟级别的程序员,毕业前在公司实习开始跟的项目,现在也差不多结束了,作为菜鸟在这几个月里学到很多东西,心里甚是狂喜,挑一个方面来写写——自定义控件。

      自定义控件就是一个封装的类,具体需要什么效果就得自己搞定了,一定得把握好封装这个特性,对封装我的理解为“画圆,你要画大的圆或是画小的圆,圆是封装对象,大小由你说的算,你不必考虑圆的实现” (不知道说得准不准确,不对请大家指正),现在我们就来画一个button吧:

        首先:封装自己的buntton,下面是控件可操作的属性和数据;

        

     private string text = "button";//显示的文字
            /// <summary>
            /// 文字
            /// </summary>
            public string Text1
            {
                get { return text; }
                set { text = value; }
            }
            private Font font =null ;//字体
            /// <summary>
            /// 字体
            /// </summary>
            public override Font Font
            {
                get { return base.Font; }
                set
                {
                    font = value;
                    base.Font = font;
                    Invalidate();
                }
            }

    下面则进入,控件的编写,在自定义控件的实现中“绘制”是很重要的部分,你可以绘制你需要的样式等等,我这里是画一个矩形并在矩形中写文字

    /// <summary>
    /// 重绘
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void UserControl1_Paint(object sender, PaintEventArgs e)
    {
    Draw(e.Graphics);
    e.Graphics .Dispose();
    }
    
    /// <summary>
    /// 画控件
    /// </summary>
    /// <param name="g"></param>
    public void Draw(Graphics g)
    {
    Size sizeF = TextRenderer.MeasureText(text, font);
    SolidBrush myBrush = new SolidBrush(System.Drawing.SystemColors.HotTrack);
    Pen pen = new Pen(myBrush, 2);
    g.DrawString(text, font, myBrush, 0 , 0);
    g.DrawLine(pen, 0, 0, sizeF.Width, 0);
    g.DrawLine(pen, 0, sizeF.Height, sizeF.Width, sizeF.Height);
    g.DrawLine(pen, 0, 0, 0, sizeF.Height);
    g.DrawLine(pen, sizeF.Width, 0, sizeF.Width, sizeF.Height); 
    font.Dispose();
    
    }
     

    一个比较粗糙的button现在九已经画好了,但是没有任何的用处,你的做点什么让他动起来,我们来给它做点动作,添加事件,要是事件不太明白就先百度下,理解下就知道怎么回事了

     /// <summary>
            /// 事件
            /// </summary>
            public event Action  ClickEvent;
            /// <summary>
            /// 鼠标移动到绘制的区域标识
            /// </summary>
            bool IsMouseOver=false ;
            /// <summary>
            /// 鼠标移动事件,当然你也可以用控件本身的MouseMove事件
            /// </summary>
            /// <param name="e"></param>
            protected override void OnMouseMove(MouseEventArgs e)
            {
                if (this.PointInGraph(e.Location))
                {
                    Cursor = Cursors.Hand;
                    IsMouseOver = true;
    
                }
                else
                {
                    Cursor = Cursors.Default;
                    IsMouseOver = false;
    
                }
    
                base.OnMouseMove(e);
            }
            protected override void OnMouseDown(MouseEventArgs e)
            {
                if (this.IsMouseOver)
                {
                    //如果事件已经注册
                    if (this.ClickEvent != null)
                    {
                        this.ClickEvent();//执行该方法
                    }
    
                }
                base.OnMouseDown(e);
            }
    
    /// <summary>
            /// 判断鼠标所在区域
            /// </summary>
            /// <param name="p"></param>
            /// <returns></returns>
            public bool PointInGraph(Point p)
            {
                bool ret = false;
                Size size = TextRenderer.MeasureText(text, font);
                Rectangle rectangle = new Rectangle(0 , 0, size.Width, size.Height);
                if (rectangle.Contains(p))
                {
                    ret = true;
                }
                font.Dispose();
                return ret;
            }

    上面的代码写完了之后呢控件基本就做好了,你可以生成解决方案了,在要加入控件的窗体的工具栏里你会看到你的自定义控件了,

    拖进来注册上事件,给定文字和字体就大功告成了;

    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace button
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                this.userControl11.ClickEvent += new Action(Show);
            }
            /// <summary>
            /// 你想做的操作
            /// </summary>
            void Show()
            {
                MessageBox.Show("自定义 button");
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                //你想改变的text和font
                Font font = new Font("微软雅黑", 18, FontStyle.Bold);
                this.userControl11.Font = font;
                this.userControl11.Text1 = "my button";
            }
        }
    }

      搞定,一个简单的自定义button控件就这样出锅了,又回到自定控件制作的初衷,想要特有的效果就得自己动手做,牢记封装这个概念。这是我的第一篇博文,写得没深度,因为知识有限,但我很乐意和大家分享,谢谢!

         

  • 相关阅读:
    Python设计模式
    Python设计模式
    Python设计模式
    Python设计模式
    Python设计模式
    Python设计模式
    Python设计模式
    Python设计模式
    composer安装以及更新问题,配置中国镜像源。
    PHP使用文件排它锁,应对小型并发
  • 原文地址:https://www.cnblogs.com/ouzining/p/3315110.html
Copyright © 2011-2022 走看看