Как работать на рисованной графике - PullRequest
0 голосов
/ 14 декабря 2018

Я создал два прямоугольника.Я хочу добавить события на них.Например, при наведении курсора мыши на одну, наведенная мышь меняет цвет, может изменять размеры или перетаскивать их (прямоугольники) в другое место ...

Мне просто интересно, смогу ли я контролировать нарисованную графику илипонравится 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 голосов
/ 14 декабря 2018

@ FJF, написание приложения, подобного MS-Paint, не является сложной задачей.Приложения Windows Forms используют GDI + для визуализации графики.так что вы можете написать простое приложение для рисования, используя WindowsForms.

@ nexolini использует панель для рисования.на самом деле Ms-Paint делает то же самое.Ms-Paint - это однослойный редактор.Таким образом, вы не можете изменить размер всех объектов в любое время, когда захотите (но, как я уже говорил, вы можете предположить, что у вас есть панель для каждой вновь нарисованной фигуры; что-то вроде того, что делает Ms-Paint).

Так в чем же проблема?

Ms-Paint не отслеживает движения мыши и не нужен (так как это один слой).Вы можете выполнять все его задачи, используя эти ответы.

например: для добавления инструмента «Цвет заливки», вы можете использовать getpixel и putpixel для создания рекурсивного алгоритма на вашем изображении.и вам не нужно знать, над какой формой вы работаете.

все остальные задачи могут быть легко реализованы.

для многослойных редакторов. Я предпочту использовать более мощную среду (но это также может быть плохо реализовано в формах Windows), как WPF.WPF использует DirectX для визуализации вашей графики, и вы можете написать плавный редактор.WPF разработан для обработки ваших графических запросов, поэтому он лучше работает с графикой.

@ Комментарии Reza_Aghaei полезны для Windows Forms.

0 голосов
/ 14 декабря 2018

Вы можете контролировать 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

0 голосов
/ 14 декабря 2018

Кроме того, вы можете создать свой собственный элемент управления, например:

  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;
    }
0 голосов
/ 14 декабря 2018

Вместо этого вы можете использовать панель управления.Просто добавьте 2 панели управления так, как вы хотите, чтобы они были расположены, и добавьте 2 обработчика событий:

private void panel1_MouseHover(object sender, EventArgs e)
    {
        panel1.BackColor = Color.Yellow;
    }

    private void panel1_MouseLeave(object sender, EventArgs e)
    {
        panel1.BackColor = Color.LightBlue;
    }
...