C#自定义控件的放置与拖动

1、自定义控件

csharp 复制代码
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、应用

csharp 复制代码
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、运行效果

在这里插入图片描述

相关推荐
diving deep5 分钟前
脚本速览-python
开发语言·python
一生了无挂16 分钟前
Java处理JSON技巧教学(从基础到高阶实战全覆盖)
java·开发语言·json
swordbob1 小时前
Spring 单例 Bean 是线程安全的吗?
java·开发语言
小小编程路1 小时前
C++ 异常 完整讲解
开发语言·c++
AI科技星2 小时前
数术工坊 · 第四卷 橡皮泥江湖(拓扑学)【完整定稿】
c语言·开发语言·汇编·electron·概率论·拓扑学
张忠琳2 小时前
【Go 1.26.4】Golang Select 深度解析
开发语言·后端·golang
用户395240998804 小时前
SqlSugar 连接 PostgreSQL 报错 42P01: relation does not exist 的排查与修复
c#
AC赳赳老秦4 小时前
OpenClaw+Power Apps 实战:自动生成 Power Apps 应用、连接 Excel 数据源
大数据·开发语言·python·serverless·excel·deepseek·openclaw
提笔了无痕4 小时前
如何用Go实现整套RAG流程
开发语言·后端·golang
(Charon)4 小时前
【C++ 面试高频基础:指针、引用、const、static、new/delete 总结】
java·开发语言