enis okatan Ответов: 1

Почему я не могу рисовать на панели, но могу рисовать на самой форме с помощью этого кода?


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

List drawingRects = new List();

        public class DrawingRectangle
        {
            public Point Location { get; set; }
            public Size Size { get; set; }
            public Point StartPosition { get; set; }
            public Color DrawingcColor { get; set; } = Color.LightGreen;
            public float PenSize { get; set; } = 3f;

        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            if (drawingRects.Count == 0) return;
            //e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;

            foreach (var rect in drawingRects)
            {
                using (Pen pen = new Pen(rect.DrawingcColor, rect.PenSize))
                {
                    e.Graphics.DrawRectangle(pen, new Rectangle(rect.Location, rect.Size));
                };
            }
        }

        private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                DrawingRectangle rect = drawingRects.Last();
                if (e.Y < rect.StartPosition.Y) { rect.Location = new Point(rect.Location.Y, e.Y); }
                if (e.X < rect.StartPosition.X) { rect.Location = new Point(e.X, rect.Location.Y); }

                rect.Size = new Size(Math.Abs(rect.StartPosition.X - e.X), Math.Abs(rect.StartPosition.Y - e.Y));
                drawingRects[drawingRects.Count - 1] = rect;
                this.Invalidate();
            }
        }

        private void panel1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                drawingRects.Add(new DrawingRectangle()
                {
                    Location = e.Location,
                    Size = Size.Empty,
                    StartPosition = e.Location
                });
            }
        }


Что я уже пробовал:

Я не знаю, что не так с этим кодом, и не мог найти ничего в интернете, но я все еще исследую.

1 Ответов

Рейтинг:
4

OriginalGriff

Начните с использования отладчика, чтобы точно проверить, что происходит: поставьте точку останова в начале каждого метода и запустите приложение.
Вы должны почти сразу же получить событие Paint, поэтому удалите или отключите его, продолжите работу приложения, а затем верните его обратно (убедившись, что вы не аннулируете форму приложения с помощью VS).
Затем удерживайте нажатой кнопку мыши, готовую к перетаскиванию. Произошло ли это событие? Если это так, следуйте коду до конца и убедитесь, что все ваши данные выглядят правильно. Временно удалите или отключите точку останова.
Продолжайте свое приложение и сделайте это снова, на этот раз удерживая и перетаскивая.
Вы должны получить третий метод срабатывания точки останова. следуйте этому коду до конца, убедитесь, что все выглядит правильно.
Продолжайте работу с вашим приложением.
Вы получили еще одно событие Paint для своей панели?

Если нет, меняйтесь

this.Invalidate();
к
panel1.Invalidate();
и попробуй еще раз.