Отрисовка линий через DrawLines C#

61
18 января 2022, 17:10

Как можно реализовать отрисовку не через основное событие Paint в winforms? Такая проблема, когда рисую в стандартном методе Form1_Paint используя событие PaintEventArgs, получается так что он отрисовывает каждую миллисекунду, а я пытаюсь сделать чтобы один раз отрисовался и всё, можно ли как то создать копию PaintEventArgs? можно ли как то сделать так чтобы я при загрузке формы один раз прорисовывал и всё? `

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 FinalVersionCourseWork
{
    public partial class Form1 : Form
    {
        //
        //круги по которым движется главный объект
        //
        static Rectangle circle_1 = new Rectangle(110, 110, 169, 169);
        Rectangle[] circles = new Rectangle[]
        {
            new Rectangle(110, 110, 169, 169),
            new Rectangle(219, 219, 232, 232),
            new Rectangle(384, 80, 200, 200),
            new Rectangle(540, 233, 120, 120),
            new Rectangle(601, 310, 225, 225),
            new Rectangle(782, 260, 100, 100),
            new Rectangle()
        };

        Rectangle rectangle_change;
        Pen pen_circle = new Pen(Color.White, 2.0f);
        Pen pen_area = new Pen(Color.Coral, 4.0f);

      //  RectangleF area = new RectangleF(0, 0, 0, 0);
        RectangleF player = new RectangleF(0, 0, 20, 20);   //главный круг
        PointF loc = PointF.Empty;
        PointF org; //центра окружности по который ходит player
        float bias_dot = 10;
        float rad;
        float angle = 0.0F;
        int numberRectangle=2;
        PointF org_2;
        PointF loc_2;
        public float rad_2;
        public float angle1;
        public float x2;
        public float y2;
        float x;    //CirclePoint
        float y;    //CirclePoint
        Triangle triangle = new Triangle();
        Graphics graphics;
        Rectangle rectangle = new Rectangle();
        PaintEventArgs aintEventArgs;
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            //aintEventArgs = new PaintEventArgs(graphics, );
            /// Graphics grfx = pea.Graphics;
            //Graphics canvas = aintEventArgs.Graphics;
            //triangle.drawTriangle(canvas);
        }
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Pen pen = new Pen(Color.Black, 3);
            // это рисует треугольники
            triangle.drawTriangle(e.Graphics);// в этом случае он каждый раз перерисовывает 

            Rectangle rec = new Rectangle(50, 50, 100, 100);
            e.Graphics.DrawEllipse(pen, circles[0]);
            e.Graphics.DrawEllipse(pen, circles[1]);
            e.Graphics.DrawEllipse(pen, circles[2]);
            e.Graphics.DrawEllipse(pen, circles[3]);
            e.Graphics.DrawEllipse(pen, circles[4]);
            e.Graphics.DrawEllipse(pen, circles[5]);
            /////////////////////////////////////////
            ///
            e.Graphics.DrawRectangle(pen, circles[0]);
            e.Graphics.DrawRectangle(pen, circles[1]);
            e.Graphics.DrawRectangle(pen, circles[2]);
            e.Graphics.DrawRectangle(pen, circles[3]);
            e.Graphics.DrawRectangle(pen, circles[4]);
            e.Graphics.DrawRectangle(pen, circles[5]);
            //
            //
            //e.Graphics.DrawEllipse(pen, rec);
            e.Graphics.DrawEllipse(pen, player);
        }

        public PointF CirclePoint(float radius, float angleInDegrees, PointF org)
        {
            x = (float)(radius * Math.Cos(angleInDegrees * Math.PI / 180F)) + org.X;
            y = (float)(radius * Math.Sin(angleInDegrees * Math.PI / 180F)) + org.Y;
            return new PointF(x, y);
        }
        private void Timer1_Tick(object sender, EventArgs e)
        {
            org = new PointF(circles[numberRectangle].X + circles[numberRectangle].Width / 2, circles[numberRectangle].Y + circles[numberRectangle].Width / 2);
            loc = CirclePoint(rad, angle, org);
            player.X = loc.X  - (player.Width / 2);
            player.Y = loc.Y  - (player.Width / 2);

            rad_2 = (circles[numberRectangle + 1].Width / 2) - player.Width / 2;

            angle1=360 - angle + 90;
            org_2 = new PointF(circles[numberRectangle+1].X + circles[numberRectangle+1].Width / 2, circles[numberRectangle+1].Y + circles[numberRectangle+1].Width / 2);
            loc_2 = CirclePoint(rad_2, angle1, org_2);
            //loc_2.X = loc_2.X - 10;
            //loc_2.Y = loc_2.Y - 10;
            label1.Text = loc.X.ToString();
            label2.Text = loc.Y.ToString();
            label3.Text = loc_2.X.ToString();
            label4.Text = loc_2.Y.ToString();
            label5.Text = angle.ToString();
            label6.Text = angle1.ToString();
            float c =loc_2.X - (player.Width / 2)-player.X;
            label7.Text = c.ToString();
            float c1 = loc_2.Y- (player.Width / 2) - player.X;
            label8.Text = c1.ToString();
            label9.Text = numberRectangle.ToString();

            if (angle < 360) angle += 2F;
            else angle = 0;
            /*
                        rad_1 = 20+(circles[numberRectangle].Width / 2) - player.Width / 2;
                        rad_2 = 20+(circles[numberRectangle + 1].Width / 2) - player.Width / 2;
                        // float rad_3 = (circles[numberRectangle-1].Width / 2) - player.Width / 2;
                        x1 = (float)(rad_1 * Math.Cos(angle * Math.PI / 180F)) + org.X;
                        y1 = (float)(rad_1 * Math.Sin(angle * Math.PI / 180F)) + org.Y;
                        angle1 = 360 - angle + 90;
                        x2 = (float)(rad_2 * Math.Cos(angle1 * Math.PI / 180F)) + org.X;
                        y2 = (float)(rad_2 * Math.Sin(angle1 * Math.PI / 180F)) + org.Y;
          */
            Invalidate();
        }
        private void Form1_MouseClick(object sender, MouseEventArgs e)
        {
           // 
            if ((loc_2.X - (player.Width / 2))-player.X<= bias_dot && loc_2.Y - (player.Width / 2)-player.Y <= bias_dot && e.Button == MouseButtons.Middle)
            {
                numberRectangle ++;
                rad = (circles[numberRectangle].Width / 2) - player.Width / 2;
                angle=angle1;
            }
            if (e.Button == MouseButtons.Left) rad = (circles[numberRectangle].Width / 2) - player.Width / 2;
            else if (e.Button == MouseButtons.Right) rad = (circles[numberRectangle].Width / 2) + player.Width / 2;

        }
    }
}

`

Answer 1

Наверное нужно отключить таймер? В событии срабатывания таймера вызывается

Invalidate();

который запускает отрисовку формы.

Возможно Вам нужно вызывать отрисовку только по какому-либо событию (например по нажатию на клавишу)

Если Вам нужно нарисовать только линии, то вот пример, как это сделать по нажатии на кнопку:

    private void button1_Click(object sender, EventArgs e)
    {
        Graphics g = this.CreateGraphics();
        {
            g.DrawLine(Pens.Black, new Point(0, 0), new Point(20, 100));
            g.DrawLine(Pens.Black, new Point(20, 100), new Point(250, 100));
        }
    }
READ ALSO
Добавление кнопки с ссылкой

Добавление кнопки с ссылкой

Коллеги, доброго времени сутокУ меня меня есть страница формата "

61
С# задать значение переменной - вызвать метод

С# задать значение переменной - вызвать метод

Добрый день дамы и господа) набросал тут вот такой код:

67
C# WPF Как в List View заменить ListViewItem на класс-наследник?

C# WPF Как в List View заменить ListViewItem на класс-наследник?

У меня есть например класс-наследник от ListViewItem - AdvancedListViewItemВ XAML я могу задать

61