先看最終成品為一個(gè)可以在XY坐標(biāo)系下,進(jìn)行點(diǎn)位顯示的控件
制作過程:
1.添加用戶控件類
2.進(jìn)入代碼編輯頁面
套路式開發(fā):繼承 UserControl? ?? public partial class PointCurve : UserControl
初始化過程:
public PointCurve()
{
InitializeComponent();
//設(shè)置控件樣式
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); //減少閃爍
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); //啟用雙緩沖技術(shù)
this.SetStyle(ControlStyles.ResizeRedraw, true); //根據(jù)窗口大小的重新繪制指令
this.SetStyle(ControlStyles.Selectable, true);//激活與用戶的交互響應(yīng)
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);//支持透明背景色
this.SetStyle(ControlStyles.UserPaint, true); //用戶自己控制繪制
}
畫圖類繪制對象的三大件:
? ? ? ?//畫布
? ? ? ? private Graphics g;
? ? ? ? //畫筆
? ? ? ? private Pen p;
? ? ? ? //畫刷
? ? ? ? private SolidBrush sb;
控件屬性:(顯示在加載進(jìn)入工具箱后的屬性界面)
/****************原點(diǎn)****************************************/
private int orginGap = 20; //內(nèi)部調(diào)用數(shù)值
[Browsable(true)] //在屬性界面顯示
[Category("自定義屬性")] //分組類別
[Description("原點(diǎn)坐標(biāo)")] //顯示名稱
public int OriginGap //外部用戶交互變量
{
get { return orginGap; }
set
{
if (value <= 0)
{
return;
}
orginGap = value;
this.Invalidate(); //外部改變后重新繪制
}
}
/****************X軸最大值****************************************/
private float maxXAxis = 70000.0f;
[Browsable(true)]
[Category("自定義屬性")]
[Description("X軸最大值")]
public float MaxXAxis
{
get { return maxXAxis; }
set { maxXAxis = value;
this.Invalidate(); //重新繪制
}
}
/****************Y軸最大值****************************************/
private float maxYAxis = 70000.0f;
[Browsable(true)]
[Category("自定義屬性")]
[Description("Y軸最大坐標(biāo)值")]
public float MaxYAxis
{
get { return maxYAxis; }
set { maxYAxis = value;
this.Invalidate(); //重新繪制
}
}
/****************位置坐標(biāo)1X軸坐標(biāo)****************************************/
[Browsable(true)]
[Category("自定義屬性")]
[Description("位置坐標(biāo)1X軸坐標(biāo)")]
public int ReclaimerXAxis
{
get { return reclaimerXAxis; }
set
{
reclaimerXAxis = value;
this.Invalidate();
}
}
/****************位置坐標(biāo)1Y軸坐標(biāo)****************************************/
private int reclaimerYAxis = 0;
[Browsable(true)]
[Category("自定義屬性")]
[Description("位置坐標(biāo)1Y軸坐標(biāo)")]
public int ReclaimerYAxis
{
get { return reclaimerYAxis; }
set
{
reclaimerYAxis = value;
this.Invalidate();
}
}
……想顯示多少個(gè)坐標(biāo)點(diǎn)可以自由添加
/****************顏色屬性添加****************************************/
private Color reclaimerColor = Color.Blue;
[Browsable(true)]
[Category("自定義屬性")]
[Description("坐標(biāo)點(diǎn)顏色")]
public Color ReclaimerColor
{
get { return reclaimerColor; }
set
{
reclaimerColor = value;
this.Invalidate();
}
}
/****************字符串屬性添加****************************************/
private string reclaimerStr = "位置1";
[Browsable(true)]
[Category("自定義屬性")]
[Description("位置1字符串")]
public string ReclaimerStr
{
get { return reclaimerStr; }
set
{
reclaimerStr = value;
this.Invalidate();
}
}
/****************繪制點(diǎn)直徑屬性添加****************************************/
private int pointdiameter = 5;
[Browsable(true)]
[Category("自定義屬性")]
[Description("繪制點(diǎn)直徑")]
public int Pointdiameter
{
get { return pointdiameter; }
set
{
pointdiameter = value;
this.Invalidate();
}
}
以上信息都是屬性信息,不涉及邏輯,屬于為了實(shí)現(xiàn)自己繪制目的而定義的成員變量
接下來重寫的OnPaint函數(shù)是真正的繪制過程,每次用戶改變屬性信息時(shí),由于執(zhí)行了? this.Invalidate();,都會(huì)后臺(tái)去調(diào)用OnPaint函數(shù),從而實(shí)現(xiàn)位置更新。
下面函數(shù)中涉及一些計(jì)算過程,其實(shí)是由于窗體繪圖默認(rèn)原點(diǎn)是左上角,而我們習(xí)慣的坐標(biāo)系原點(diǎn)的左下角,里面的計(jì)算過程是為了將我們輸入的位置坐標(biāo)進(jìn)行轉(zhuǎn)換的過程,無需過分糾結(jié),理解原理,this.Height.,this.with為實(shí)際的繪圖畫布大小文章來源:http://www.zghlxwxcb.cn/news/detail-761116.html
protected override void OnPaint(PaintEventArgs e) //執(zhí)行重繪指令時(shí)會(huì)被調(diào)用
{
base.OnPaint(e);
//繪制過程
//繪制畫布
g = e.Graphics;
//設(shè)置畫布
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;//消除鋸齒
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
//正式繪制
//設(shè)置畫筆
p = new Pen(Color.Black, 1.5f);
p.CustomEndCap = new AdjustableArrowCap(p.Width * 3, p.Width * 4, true); //結(jié)束端采用箭頭樣式
//繪制X軸
g.DrawLine(p, new Point(orginGap, this.Height - orginGap), new Point(this.Width - orginGap, this.Height - orginGap));
//繪制Y軸
g.DrawLine(p, new Point(orginGap, this.Height - orginGap), new Point(orginGap, orginGap));
//繪制原點(diǎn)
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;//字符中心居中
sf.LineAlignment = StringAlignment.Center;//線中心居中
g.DrawString("0", this.Font, new SolidBrush(Color.Black), new Rectangle(0, this.Height - orginGap, orginGap, orginGap), sf);
//繪制X軸最大
g.DrawString(maxXAxis.ToString(), this.Font, new SolidBrush(Color.Black), new Rectangle(this.Width -50, this.Height -orginGap+5, 50, orginGap), sf);
//繪制Y軸最大
g.DrawString(maxYAxis.ToString(), this.Font, new SolidBrush(Color.Black), new Rectangle(0, 0, 50, orginGap), sf);
//繪制取料點(diǎn)
float reclaimerX = (this.Width - 2 * orginGap) / maxXAxis * reclaimerXAxis + orginGap;
float reclaimerY = this.Height - ((this.Height - 2 * orginGap) / maxYAxis * reclaimerYAxis + orginGap);
g.FillEllipse(new SolidBrush(reclaimerColor), new RectangleF(reclaimerX - 0.5f * pointdiameter, reclaimerY - 0.5f * pointdiameter, pointdiameter, pointdiameter));
g.DrawString(reclaimerStr, this.Font, new SolidBrush(reclaimerColor), new RectangleF(reclaimerX - 25.0f, reclaimerY - 20.0f, 50.0f, 20.0f), sf);
//繪制加工點(diǎn)
float processX = (this.Width - 2 * orginGap) / maxXAxis * processXAxis + orginGap;
float processY = this.Height - ((this.Height - 2 * orginGap) / maxYAxis * processYAxis + orginGap);
g.FillEllipse(new SolidBrush(processColor), new RectangleF(processX - 0.5f * pointdiameter, processY - 0.5f * pointdiameter, pointdiameter, pointdiameter));
g.DrawString(processStr, this.Font, new SolidBrush(processColor), new RectangleF(processX - 25.0f, processY - 20.0f, 50.0f, 20.0f), sf);
//繪制出料點(diǎn)
float outletX = (this.Width - 2 * orginGap) / maxXAxis * outletXAxis + orginGap;
float outletY = this.Height - ((this.Height - 2 * orginGap) / maxYAxis * outletYAxis + orginGap);
g.FillEllipse(new SolidBrush(outletColor), new RectangleF(outletX - 0.5f * pointdiameter, outletY - 0.5f * pointdiameter, pointdiameter, pointdiameter));
g.DrawString(outletStr, this.Font, new SolidBrush(outletColor), new RectangleF(outletX - 25.0f, outletY - 20.0f, 50.0f, 20.0f), sf);
}
下面附完整代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-761116.html
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
namespace WindowsFormsApp1
{
public partial class PointCurve : UserControl
{
public PointCurve()
{
InitializeComponent();
//設(shè)置控件樣式
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); //減少閃爍
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); //啟用雙緩沖技術(shù)
this.SetStyle(ControlStyles.ResizeRedraw, true); //根據(jù)窗口大小的重新繪制指令
this.SetStyle(ControlStyles.Selectable, true);//激活與用戶的交互響應(yīng)
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);//支持透明背景色
this.SetStyle(ControlStyles.UserPaint, true); //用戶自己控制繪制
}
#region 繪制對象的創(chuàng)建
//畫布
private Graphics g;
//畫筆
private Pen p;
//畫刷
private SolidBrush sb;
#endregion
#region 控件屬性
private int orginGap = 20;
[Browsable(true)]
[Category("自定義屬性")]
[Description("原點(diǎn)坐標(biāo)")]
public int OriginGap
{
get { return orginGap; }
set
{
if (value <= 0)
{
return;
}
orginGap = value;
this.Invalidate(); //重新繪制
}
}
private float maxXAxis = 70000.0f;
[Browsable(true)]
[Category("自定義屬性")]
[Description("X軸最大值")]
public float MaxXAxis
{
get { return maxXAxis; }
set { maxXAxis = value;
this.Invalidate(); //重新繪制
}
}
private float maxYAxis = 70000.0f;
[Browsable(true)]
[Category("自定義屬性")]
[Description("Y軸最大坐標(biāo)值")]
public float MaxYAxis
{
get { return maxYAxis; }
set { maxYAxis = value;
this.Invalidate(); //重新繪制
}
}
private int reclaimerXAxis = 0;
[Browsable(true)]
[Category("自定義屬性")]
[Description("取料口X軸坐標(biāo)")]
public int ReclaimerXAxis
{
get { return reclaimerXAxis; }
set
{
reclaimerXAxis = value;
this.Invalidate();
}
}
private int reclaimerYAxis = 0;
[Browsable(true)]
[Category("自定義屬性")]
[Description("取料口Y軸坐標(biāo)")]
public int ReclaimerYAxis
{
get { return reclaimerYAxis; }
set
{
reclaimerYAxis = value;
this.Invalidate();
}
}
private int processXAxis = 0;
[Browsable(true)]
[Category("自定義屬性")]
[Description("加工處X軸坐標(biāo)")]
public int ProcessXAxis
{
get { return processXAxis; }
set
{
processXAxis = value;
this.Invalidate();
}
}
private int processYAxis = 0;
[Browsable(true)]
[Category("自定義屬性")]
[Description("加工處Y軸坐標(biāo)")]
public int ProcessYAxis
{
get { return processYAxis; }
set
{
processYAxis = value;
this.Invalidate();
}
}
private int outletXAxis = 0;
[Browsable(true)]
[Category("自定義屬性")]
[Description("出料口X軸坐標(biāo)")]
public int OutletXAxis
{
get { return outletXAxis; }
set
{
outletXAxis = value;
this.Invalidate();
}
}
private int outletYAxis = 0;
[Browsable(true)]
[Category("自定義屬性")]
[Description("出料口Y軸坐標(biāo)")]
public int OutletYAxis
{
get { return outletYAxis; }
set
{
outletYAxis = value;
this.Invalidate();
}
}
private Color reclaimerColor = Color.Blue;
[Browsable(true)]
[Category("自定義屬性")]
[Description("取料口點(diǎn)顏色")]
public Color ReclaimerColor
{
get { return reclaimerColor; }
set
{
reclaimerColor = value;
this.Invalidate();
}
}
private Color processColor = Color.Green;
[Browsable(true)]
[Category("自定義屬性")]
[Description("加工處點(diǎn)顏色")]
public Color ProcessColor
{
get { return processColor; }
set
{
processColor = value;
this.Invalidate();
}
}
private Color outletColor = Color.Red;
[Browsable(true)]
[Category("自定義屬性")]
[Description("出料口點(diǎn)顏色")]
public Color OutletColor
{
get { return outletColor; }
set
{
outletColor = value;
this.Invalidate();
}
}
private string reclaimerStr = "取料口";
[Browsable(true)]
[Category("自定義屬性")]
[Description("取料口字符串")]
public string ReclaimerStr
{
get { return reclaimerStr; }
set
{
reclaimerStr = value;
this.Invalidate();
}
}
private string processStr = "加工處";
[Browsable(true)]
[Category("自定義屬性")]
[Description("加工處字符串")]
public string ProcessStr
{
get { return processStr; }
set
{
processStr = value;
this.Invalidate();
}
}
private string outletStr = "出料口";
[Browsable(true)]
[Category("自定義屬性")]
[Description("出料口字符串")]
public string OutletStr
{
get { return outletStr; }
set
{
outletStr = value;
this.Invalidate();
}
}
private int pointdiameter = 5;
[Browsable(true)]
[Category("自定義屬性")]
[Description("繪制點(diǎn)直徑")]
public int Pointdiameter
{
get { return pointdiameter; }
set
{
pointdiameter = value;
this.Invalidate();
}
}
#endregion
protected override void OnPaint(PaintEventArgs e) //執(zhí)行重繪指令時(shí)會(huì)被調(diào)用
{
base.OnPaint(e);
//繪制過程
//繪制畫布
g = e.Graphics;
//設(shè)置畫布
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;//消除鋸齒
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
//正式繪制
//設(shè)置畫筆
p = new Pen(Color.Black, 1.5f);
p.CustomEndCap = new AdjustableArrowCap(p.Width * 3, p.Width * 4, true); //結(jié)束端采用箭頭樣式
//繪制X軸
g.DrawLine(p, new Point(orginGap, this.Height - orginGap), new Point(this.Width - orginGap, this.Height - orginGap));
//繪制Y軸
g.DrawLine(p, new Point(orginGap, this.Height - orginGap), new Point(orginGap, orginGap));
//繪制原點(diǎn)
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;//字符中心居中
sf.LineAlignment = StringAlignment.Center;//線中心居中
g.DrawString("0", this.Font, new SolidBrush(Color.Black), new Rectangle(0, this.Height - orginGap, orginGap, orginGap), sf);
//繪制X軸最大
g.DrawString(maxXAxis.ToString(), this.Font, new SolidBrush(Color.Black), new Rectangle(this.Width -50, this.Height -orginGap+5, 50, orginGap), sf);
//繪制Y軸最大
g.DrawString(maxYAxis.ToString(), this.Font, new SolidBrush(Color.Black), new Rectangle(0, 0, 50, orginGap), sf);
//繪制取料點(diǎn)
float reclaimerX = (this.Width - 2 * orginGap) / maxXAxis * reclaimerXAxis + orginGap;
float reclaimerY = this.Height - ((this.Height - 2 * orginGap) / maxYAxis * reclaimerYAxis + orginGap);
g.FillEllipse(new SolidBrush(reclaimerColor), new RectangleF(reclaimerX - 0.5f * pointdiameter, reclaimerY - 0.5f * pointdiameter, pointdiameter, pointdiameter));
g.DrawString(reclaimerStr, this.Font, new SolidBrush(reclaimerColor), new RectangleF(reclaimerX - 25.0f, reclaimerY - 20.0f, 50.0f, 20.0f), sf);
//繪制加工點(diǎn)
float processX = (this.Width - 2 * orginGap) / maxXAxis * processXAxis + orginGap;
float processY = this.Height - ((this.Height - 2 * orginGap) / maxYAxis * processYAxis + orginGap);
g.FillEllipse(new SolidBrush(processColor), new RectangleF(processX - 0.5f * pointdiameter, processY - 0.5f * pointdiameter, pointdiameter, pointdiameter));
g.DrawString(processStr, this.Font, new SolidBrush(processColor), new RectangleF(processX - 25.0f, processY - 20.0f, 50.0f, 20.0f), sf);
//繪制出料點(diǎn)
float outletX = (this.Width - 2 * orginGap) / maxXAxis * outletXAxis + orginGap;
float outletY = this.Height - ((this.Height - 2 * orginGap) / maxYAxis * outletYAxis + orginGap);
g.FillEllipse(new SolidBrush(outletColor), new RectangleF(outletX - 0.5f * pointdiameter, outletY - 0.5f * pointdiameter, pointdiameter, pointdiameter));
g.DrawString(outletStr, this.Font, new SolidBrush(outletColor), new RectangleF(outletX - 25.0f, outletY - 20.0f, 50.0f, 20.0f), sf);
}
private void PointCurve_Load(object sender, EventArgs e)
{
}
}
}
到了這里,關(guān)于C#中添加自制控件的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!