如何在绘制的图形上进行操作

时间:2018-12-14 03:50:35

标签: c# winforms draw

我创建了两个矩形。我想在上面添加事件。例如,当鼠标悬停在一个上时,悬停的鼠标将改变颜色,可以调整大小或将它们(矩形)拖动到其他位置...

我只是想知道我是否可以控制绘制的图形,或者它会像 Microsoft Paint 那样,在绘制之后,除非清除画布并重新绘制,否则该对象将无法操作。

是否有可能控制绘制的图形,谢谢您的任何建议。

我绘制的图形的简单代码

private void Form1_Paint(object sender, PaintEventArgs e)
{
    // Create pen.
    Pen blackPen = new Pen(Color.Black, 3);

    // Create rectangle.
    Rectangle rect1 = new Rectangle(20, 20, 250, 250);
    Rectangle rect2 = new Rectangle(70, 70, 150, 150);

    // Draw rectangle to screen.
    e.Graphics.FillRectangle(Brushes.DeepSkyBlue, rect1);
    e.Graphics.FillRectangle(Brushes.LightBlue, rect2);
}

4 个答案:

答案 0 :(得分:1)

此外,您可以创建自己的控件,例如:

  class RectangleControl : Control
{
    public void FillRectangle(Color color)
    {
        this.BackColor = color;
    }
}

然后:

  private void Form1_Paint(object sender, PaintEventArgs e)
    {
        RectangleControl rect1 = new RectangleControl() { Parent = this, Left = 20, Top = 20, Width = 250, Height = 250 };
        rect1.FillRectangle(Color.DeepSkyBlue);
        RectangleControl rect2 = new RectangleControl() { Parent = rect1, Left = 50, Top = 50, Width = 150, Height = 150 };
        rect2.FillRectangle(Color.LightBlue);
        rect1.MouseHover += Rect1_MouseHover;
        rect2.MouseLeave += Rect2_MouseLeave;
    }

    private void Rect2_MouseLeave(object sender, EventArgs e)
    {
        (sender as RectangleControl).BackColor = Color.Yellow;
    }

    private void Rect1_MouseHover(object sender, EventArgs e)
    {
        (sender as RectangleControl).BackColor = Color.LightBlue;
    }

答案 1 :(得分:0)

您可以改为使用面板控件。 只需添加2个面板控件即可,并添加2个事件处理程序:

Measure 2 = 
    IF(
        HASONEVALUE(CPP[KPI Group]), 
        DIVIDE(
            SUM(CPP[Actual Y.T.D]), 
            SUM('Corporate Planning Project'[Full Year Budget]),
            0
        )
    )

答案 2 :(得分:0)

您可以监视MouseMove

这里的代码使用MouseMove和矩形使用的一些笔刷值。

using System.Drawing;
using System.Windows.Forms;

namespace Question_Answer_WinForms_App
{
    public partial class Form1 : Form
    {
        public Brush outerRectangleBrush = Brushes.DeepSkyBlue;
        public Brush innerRectangleBrush = Brushes.LightBlue;

        public Form1()
        {
            InitializeComponent();
            Paint += Form1_Paint;
            MouseMove += Form1_MouseMove;
        }

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            var isWithinOuterRectangle = e.Location.X >= 20
                                      && e.Location.X <= 250 + 20
                                      && e.Location.Y >= 20
                                      && e.Location.Y <= 250 + 20;

            var isWithinInnerRectangle = e.Location.X >= 70
                                      && e.Location.X <= 150 + 70
                                      && e.Location.Y >= 70
                                      && e.Location.Y <= 150 + 70;

            if (isWithinOuterRectangle)
            {
                if (isWithinInnerRectangle)
                {
                    outerRectangleBrush = Brushes.DeepSkyBlue;
                    innerRectangleBrush = Brushes.Red;
                    Refresh();
                }
                else
                {
                    outerRectangleBrush = Brushes.Red;
                    innerRectangleBrush = Brushes.LightBlue;
                    Refresh();
                }
            }
            else
            {
                outerRectangleBrush = Brushes.DeepSkyBlue;
                innerRectangleBrush = Brushes.LightBlue;
                Refresh();
            }
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            // Create pen.
            Pen blackPen = new Pen(Color.Black, 3);

            // Create rectangle.
            Rectangle rect1 = new Rectangle(20, 20, 250, 250);
            Rectangle rect2 = new Rectangle(70, 70, 150, 150);

            // Draw rectangle to screen.
            e.Graphics.FillRectangle(outerRectangleBrush, rect1);
            e.Graphics.FillRectangle(innerRectangleBrush, rect2);
        }
    }
}

enter image description here enter image description here enter image description here

答案 3 :(得分:0)

@FJF,编写类似于ms-paint的应用程序并不复杂。 Windows窗体应用程序正在使用GDI +渲染图形。因此您可以使用WindowsForms编写一个简单的绘画应用程序。

@nexolini使用面板进行一些绘制。实际上,佩恩女士也这样做。 Ms-Paint是单层编辑器。因此,您无法随时调整所有对象的大小(但是正如我之前所说,您可以假设每个新绘制的Shapes都有一个面板;类似于Ms-Paint所做的事情)。

那是什么问题?

Ms-Paint不会跟踪鼠标的移动,也不需要(因为它是单层)。您可以使用这些答案完成所有任务。

例如:用于添加“填充颜色”工具,您可以使用getpixel和putpixel对图像执行递归算法。而且您无需知道您正在加工哪种形状。

其他所有任务都可以轻松实现。

对于多层编辑器,我将更喜欢使用更强大的框架(但它也可能以不良的方式在Windows窗体中实现),例如WPF。 WPF使用DirectX渲染图形,并且您可以编写流畅的编辑器。 WPF旨在处理您的图形请求,因此在图形上表现更好。

@Reza_Aghaei的注释对于Windows窗体很有用。