刚毕业,就是个菜鸟级别的程序员,毕业前在公司实习开始跟的项目,现在也差不多结束了,作为菜鸟在这几个月里学到很多东西,心里甚是狂喜,挑一个方面来写写——自定义控件。
自定义控件就是一个封装的类,具体需要什么效果就得自己搞定了,一定得把握好封装这个特性,对封装我的理解为“画圆,你要画大的圆或是画小的圆,圆是封装对象,大小由你说的算,你不必考虑圆的实现” (不知道说得准不准确,不对请大家指正),现在我们就来画一个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控件就这样出锅了,又回到自定控件制作的初衷,想要特有的效果就得自己动手做,牢记封装这个概念。这是我的第一篇博文,写得没深度,因为知识有限,但我很乐意和大家分享,谢谢!