C# Panel 画矩形图并可进行移动

我在Panel里面画几个矩形图画好后并且可以进行拖动和更改它的大小。关键是怎么拖动已经画好和它的大小。没有好多分了,感谢大家。... 我在Panel里面画几个矩形图 画好后并且可以进行拖动和更改它的大小。关键是怎么拖动已经画好和它的大小。没有好多分了,感谢大家。 展开
 我来答
百度网友862b31c
2015-05-07 · TA获得超过1529个赞
知道小有建树答主
回答量:1045
采纳率:100%
帮助的人:819万
展开全部

定义图像的基类:

abstract class DrawBase
{
    internal Color m_BackColor;
    internal Color m_ForeColor;
    internal static int m_HalfGrab;

    public static int HalfGrab
    {
        get { return DrawBase.m_HalfGrab; }
        set { DrawBase.m_HalfGrab = value; }
    }

    public Color BackColor
    {
        get { return m_BackColor; }
        set { m_BackColor = value; }
    }

    public Color ForeColor
    {
        get { return m_ForeColor; }
        set { m_ForeColor = value; }
    }

    public abstract Rectangle GetBound();
    public abstract void Draw(Graphics g);
    public abstract bool Near(int x, int y);
    public abstract void SetBound(Rectangle bound);
}

定义矩形:

class RectangleObj:DrawBase
{
    private Point m_Start;
    private Point m_End;
    private bool m_Solid;
    public RectangleObj(Point start, Point end)
    {
        this.m_Start = start;
        this.m_End = end;
    }
    public bool Solid
    {
        get { return m_Solid; }
        set { m_Solid = value; }
    }
    public override System.Drawing.Rectangle GetBound()
    {
        int x = this.m_Start.X < this.m_End.X ? this.m_Start.X : this.m_End.X;
        int y = this.m_Start.Y < this.m_End.Y ? this.m_Start.Y : this.m_End.Y;
        int r = this.m_Start.X < this.m_End.X ? this.m_End.X : this.m_Start.X;
        int b = this.m_Start.Y < this.m_End.Y ? this.m_End.Y : this.m_Start.Y;
        return Rectangle.FromLTRB(x, y, r, b);
    }

    public override void Draw(Graphics g)
    {
        Rectangle bound = this.GetBound();
        if (this.m_Solid)
        {
            using (SolidBrush brush = new SolidBrush(this.m_BackColor))
            {
                g.FillRectangle(brush, bound);
            }
        }
        using (Pen pen = new Pen(this.m_ForeColor))
        {
            g.DrawRectangle(pen, bound);
        }
    }

    public override bool Near(int x, int y)
    {
        Rectangle bound = this.GetBound();
        Rectangle inner = bound;
        Rectangle outer = bound;
        inner.Inflate(-m_HalfGrab, -m_HalfGrab);
        outer.Inflate(m_HalfGrab, m_HalfGrab);
        Region reg = new Region(outer);
        reg.Exclude(inner);
        return reg.IsVisible(x, y);
    }

    public override void SetBound(Rectangle bound)
    {
        this.m_Start = new Point(bound.X, bound.Y);
        this.m_End = new Point(bound.Right, bound.Bottom);
    }
}

定义图像的集合对象:

class DrawList:List<DrawBase>
{
    private Control m_Owner;
    public DrawList(Control owner)
    { 
        this.m_Owner = owner;
    }
    internal DrawBase GetNear(int x, int y)
    {
        foreach (DrawBase draw in this)
        {
            if (draw.Near(x, y))
            {
                return draw;
            }
        }
        return null;
    }

    internal void Draw(Graphics graphics)
    {
        foreach (DrawBase draw in this)
        {
            draw.Draw(graphics);
        }
    }
}

构建一个Window窗体用来展示图像操作:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DrawLines.DrawObjs;

namespace DrawLines
{
    public partial class Form1 : Form
    {
        private DrawList m_drawList;
        private DrawBase m_curDraw;
        private Rectangle m_curBound;
        private Rectangle m_lastBound;
        private Point m_StartPoint;
        public Form1()
        {
            InitializeComponent();
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);

            this.InitObjs();
        }
        /// <summary>
        /// 构造对象
        /// </summary>
        private void InitObjs()
        {
            this.m_drawList = new DrawList(this);

            DrawBase.HalfGrab = 5;
            LineObj line0 = new LineObj(new Point(10, 10), new Point(100, 100));
            line0.ForeColor = Color.Red;

            LineObj line1 = new LineObj(new Point(16, 67), new Point(100, 180));
            line1.ForeColor = Color.Blue;

            RectangleObj rect = new RectangleObj(new Point(120, 70), new Point(220, 200));
            rect.ForeColor = Color.Green;

            ButtonObj button = new ButtonObj(new Point(20, 20), new Point(90, 45));
            button.ForeColor = Color.Black;
            button.Text = "button1";
            m_drawList.Add(line0);
            m_drawList.Add(line1);
            m_drawList.Add(rect);
            m_drawList.Add(button);
        }
        /// <summary>
        /// 绘制对象
        /// </summary>
        /// <param name="e"></param>
        protected override void OnPaint(PaintEventArgs e)
        {
            this.m_drawList.Draw(e.Graphics);
            base.OnPaint(e);
        }
        /// <summary>
        /// 重写以移动对象或设置鼠标
        /// </summary>
        /// <param name="e"></param>
        protected override void OnMouseMove(MouseEventArgs e)
        {
            base.OnMouseMove(e);
            if (this.Capture)
            {
                if (this.m_curDraw != null)
                {
                    this.moveObj(e);
                }
                return;
            }
            if (this.m_drawList.GetNear(e.X, e.Y) != null)
            {
                this.Cursor = Cursors.SizeAll;
            }
            else
            {
                this.Cursor = Cursors.Default;
            }
        }
        /// <summary>
        /// 重写以获取鼠标下的对象
        /// </summary>
        /// <param name="e"></param>
        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);
            this.getObj(e);
        }
        /// <summary>
        /// 重写以按Delete键删除当前对象
        /// </summary>
        /// <param name="keyData"></param>
        /// <returns></returns>
        protected override bool ProcessDialogKey(Keys keyData)
        {
            if (keyData == Keys.Delete)
            {
                if (this.m_curDraw != null)
                {
                    this.deleteObj();
                }
            }
            return base.ProcessDialogKey(keyData);
        }
        private void btnDelete_Click(object sender, EventArgs e)
        {
            if (this.m_curDraw != null)
            {
                this.deleteObj();
            }
            else
            {
                MessageBox.Show(this, "没有选中的对象,请使用鼠标点选择一个!", "提示");
            }
        }
        private void moveObj(MouseEventArgs e)
        {
            Rectangle bound = this.m_curBound;

            bound.Offset(e.X - this.m_StartPoint.X, e.Y - this.m_StartPoint.Y);
            this.m_curDraw.SetBound(bound);

            Rectangle _last = this.m_lastBound;
            Rectangle _bound = bound;
            _last.Inflate(2, 2);
            _bound.Inflate(2, 2);

            using (Region invReg = new Region(_last))
            {
                invReg.Union(_bound);
                this.Invalidate(invReg);
            }
            this.m_lastBound = bound;
        }
        private void getObj(MouseEventArgs e)
        {
            this.m_curDraw = this.m_drawList.GetNear(e.X, e.Y);
            if (this.m_curDraw != null)
            {
                this.m_curBound = this.m_curDraw.GetBound();
                this.m_StartPoint = e.Location;
            }
        }
        private void deleteObj()
        {
            Rectangle bound = this.m_curDraw.GetBound();
            this.m_drawList.Remove(this.m_curDraw);
            this.m_curDraw = null;
            bound.Inflate(2, 2);
            this.Invalidate(bound);
        }
    }
}

运行起来使用鼠标可以画图并移动图像。

光点科技
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件... 点击进入详情页
本回答由光点科技提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式