勇哥注:
所谓的基类控件,就是不从其它控件继承的,而是继承UserControl的控件。
控件外观如下:
此控件有如下5个属性:
有关用户控件,下面这篇文章讲得很清楚:
https://blog.csdn.net/sl1990129/article/details/78959264
源码:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace GDI基类控件1 { public enum ContentAlign { Left,Center,Right } internal class MyButton:UserControl { public MyButton() { } private Color backColor=Color.FromArgb(15,93,244); //生成代码的时候生成到设计器代码里去 [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] [Description("背景颜色"),Category("自定义"),Browsable(true)] public Color BackColor { get { return backColor; } set { backColor = value; this.Refresh(); } } private Color borderColor=Color.FromArgb(14,43,94); [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] [Description("边框颜色"), Category("自定义"), Browsable(true)] public Color BorderColor { get { return borderColor; } set { borderColor = value; this.Refresh(); } } private int borderWidth; [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] [Description("边框宽度"), Category("自定义"), Browsable(true)] public int BorderWidth { get { return borderWidth; } set { borderWidth = value; this.Refresh(); } } private string content; [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] [Description("内容"), Category("自定义"), Browsable(true)] public string Content { get { return content; } set { content = value; this.Refresh(); } } private ContentAlign contentAlign= ContentAlign.Center; [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] [Description("内容布局方向"), Category("自定义"), Browsable(true)] public ContentAlign ContentAlign { get { return contentAlign; } set { contentAlign = value; this.Refresh(); } } protected override void OnPaint(PaintEventArgs e) { //基类控件首先要加入一个矩形,代表当前控件的大小 GraphicsPath gPath = new GraphicsPath(); gPath.AddRectangle(this.ClientRectangle); e.Graphics.FillPath(new SolidBrush(BackColor), gPath); if(borderWidth>0) { //-1的问题是微软控件像素的问题,奇数时会出现问题 偶数不会 if(borderWidth%2!=0) { Rectangle rec = this.ClientRectangle; rec.Width -= 1; rec.Height -= 1; gPath.AddRectangle(rec); } e.Graphics.DrawPath(new Pen(borderColor, borderWidth), gPath); } if(!string.IsNullOrEmpty(content)) { //计算文字大小 SizeF s = e.Graphics.MeasureString(content, this.Font); SolidBrush sBrush = new SolidBrush(this.ForeColor); switch(contentAlign) { case ContentAlign.Left: e.Graphics.DrawString(content, this.Font, sBrush, this.Padding.Left, (this.Height - s.Height) / 2); break; case ContentAlign.Center: e.Graphics.DrawString(content, this.Font, sBrush, (this.Width - s.Width) / 2, (this.Height - s.Height) / 2); break; case ContentAlign.Right: e.Graphics.DrawString(content, this.Font, sBrush, this.Width - s.Width-this.Padding.Right, (this.Height - s.Height) / 2); break; default: break; } } base.OnPaint(e); } } }
本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

本帖最后由 勇哥,很想停止 于 2023-05-23 22:58:01 编辑 
