勇哥注:
所谓的基类控件,就是不从其它控件继承的,而是继承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 编辑 

少有人走的路



















