1、自定义控件
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 PartApp.Uc
{
public class And:Control
{
private bool dragging = false;
private Point dragCursorPoint;
private Point dragFormPoint;
public And()
{
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
this.MouseUp += And_MouseUp;
this.MouseMove += And_MouseMove;
this.MouseDown += And_MouseDown;
}
private void And_MouseDown(object sender, MouseEventArgs e)
{
dragging = true;
dragCursorPoint = Cursor.Position;
dragFormPoint = this.Location;
}
private void And_MouseMove(object sender, MouseEventArgs e)
{
if (dragging)
{
Point dif = Point.Subtract(Cursor.Position, new Size(dragCursorPoint));
this.Location = Point.Add(dragFormPoint, new Size(dif));
}
}
private void And_MouseUp(object sender, MouseEventArgs e)
{
dragging = false;
}
private double length = 40;
[Browsable(true)]
[Category("Pin")]
[Description("引脚长度")]
public double Length
{
get { return length; }
set { length = value; }
}
private Size sensitive = new Size(10, 10);
[Browsable(true)]
[Category("Pin")]
[Description("感应区")]
public Size Sensitive
{
get { return sensitive; }
set { sensitive = value; }
}
//边框线宽
//框内字体类型
//框内字体大小
//引脚字体类型
//引脚字体大小
//文字缩进
protected override void OnPaint(PaintEventArgs e)
{
Width = 80; Height = 50;
int indentation = 2;
Graphics g = e.Graphics;
g.SmoothingMode = SmoothingMode.HighQuality;
int frameTop = Height / 10; //边框上边距
int frameLeft = Sensitive.Width;
g.DrawRectangle(new Pen(Color.Black, 5), frameLeft, frameTop, Width-2* frameLeft, Height-2* frameTop);
g.FillRectangle(new SolidBrush(Color.AliceBlue), frameLeft, frameTop, Width - 2 * frameLeft, Height-2* frameTop);
Font font = new Font("Arial", 10, FontStyle.Bold);
SizeF size = g.MeasureString("&",font);
g.DrawString("&", font, new SolidBrush(Color.Blue), (Width-size.Width)/2, (Height-size.Height)/2);
int interval = Height / 5;
int currentInterval = interval;
font = new Font("Arial", 9, FontStyle.Regular);
g.FillRectangle(new SolidBrush(Color.Blue), 0, currentInterval, Sensitive.Width, Sensitive.Height);
g.DrawString("I1", font, new SolidBrush(Color.Blue), Sensitive.Width + indentation, currentInterval);
currentInterval = 3*interval;
g.FillRectangle(new SolidBrush(Color.Blue), 0, currentInterval, Sensitive.Width, Sensitive.Height);
g.DrawString("I1", font, new SolidBrush(Color.Blue), Sensitive.Width+ indentation, currentInterval);
currentInterval = 2 * interval;
g.FillRectangle(new SolidBrush(Color.Blue), Width- frameLeft, currentInterval, Sensitive.Width, Sensitive.Height);
size = g.MeasureString("O1", font);
g.DrawString("O1", font, new SolidBrush(Color.Blue), Width - Sensitive.Width- indentation-size.Width, currentInterval);
}
}
}
2、应用
using PartApp.Uc;
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;
namespace PartApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string currentPart = "";
private void button1_Click(object sender, EventArgs e)
{
currentPart = "Button";
}
private void panel1_MouseClick(object sender, MouseEventArgs e)
{
if(e.Button == MouseButtons.Left)
{
if (currentPart != "")
{
And and = new And();
and.Location = e.Location;
and.Sensitive = new System.Drawing.Size(10, 10);
and.Size = new System.Drawing.Size(80, 50);
this.panel1.Controls.Add(and);
currentPart = "";
}
}
}
}
}
3、运行效果
在这里插入图片描述