ouzining

 

简单制作自定义控件

 

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

  自定义控件就是一个封装的类,具体需要什么效果就得自己搞定了,一定得把握好封装这个特性,对封装我的理解为“画圆,你要画大的圆或是画小的圆,圆是封装对象,大小由你说的算,你不必考虑圆的实现” (不知道说得准不准确,不对请大家指正),现在我们就来画一个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控件就这样出锅了,又回到自定控件制作的初衷,想要特有的效果就得自己动手做,牢记封装这个概念。这是我的第一篇博文,写得没深度,因为知识有限,但我很乐意和大家分享,谢谢!

 

     

 

posted on 2013-09-13 18:18  ouzining  阅读(425)  评论(3编辑  收藏  举报

导航