Как перерисовать линию, используя значения из трекбара в реальном времени?

Мне просто интересно, не могли бы вы помочь мне с этой проблемой.

В моей программе я должен использовать событие рисования, чтобы нарисовать линию, которая действует как «башенка». Я должен использовать трекбар, чтобы выбрать угол, под которым я буду «выстреливать» из этой турели. Моя проблема в том, что я не уверен, как это закодировать, чтобы строка «Башня» перерисовывалась каждый раз, когда значение на трекбаре изменяется. Я попытался использовать Refresh(), который позволял рисовать линию в реальном времени, но из-за этого форма мерцала черно-белой и перерисовывала линию под разными углами по отношению к тому, что было выбрано.

Любая помощь будет принята с благодарностью. Спасибо!

Вот скриншот формы из приведенного ниже кода, работающего в Visual Basic 2010.

public partial class Form1 : Form
    {
            double xEnd = 0;
            double yEnd = 0;
            double xOrigin = 30;
            double yOrigin = 450;
            double xHor = 30;
            double yHor = 350;
            double xVert = 130;
            double yVert = 450;
            double lineLength = 100;
            public Form1()
            {
                xEnd = xOrigin + lineLength;
                yEnd = yOrigin;
                InitializeComponent();
            }

            private void LineDrawEvent(object sender, PaintEventArgs paint)
            {
                Graphics drawSurface = paint.Graphics;
                Pen turretLine = new Pen(Color.Blue);
                Pen graphHorizontal = new Pen(Color.Red);
                Pen graphVertical = new Pen(Color.Red);
                Pen firedLine = new Pen(Color.Blue);

                drawSurface.DrawLine(graphVertical, (int)xOrigin, (int)yOrigin, (int)xHor, (int)yHor);
                drawSurface.DrawLine(graphHorizontal, (int)xOrigin, (int)yOrigin, (int)xVert, (int)yVert);

                double angleInRadians = ConvertDegsToRads((double)trckBarAngle.Value);
                xEnd = xOrigin + lineLength * Math.Cos(angleInRadians);
                yEnd = yOrigin - lineLength * Math.Sin(angleInRadians);

                drawSurface.DrawLine(turretLine, (int)xOrigin, (int)yOrigin, (int)xEnd, (int)yEnd);
            }
     private void trckBarAngle_Scroll(object sender, EventArgs e)
            {
                lblAngle.Text = "Angle is:" + Convert.ToString((double)trckBarAngle.Value / 2);
            }
            private double ConvertDegsToRads(double degrees)
            {
                return degrees * (Math.PI / 180.0);
            }
        }

person Brian Leigh    schedule 31.10.2015    source источник
comment
Форма.DoubleBuffered = true.   -  person TaW    schedule 01.11.2015
comment
Я изменил это в свойствах формы, но, к сожалению, это не имело значения. Что именно это должно было изменить? Я новичок в С#, так что извините за нубские вопросы.   -  person Brian Leigh    schedule 01.11.2015
comment
Это должно остановить мерцание.   -  person TaW    schedule 01.11.2015
comment
Ах тоже получилось, спасибо! Однако теперь ни одна из меток не отображается, а все кнопки и трекбар имеют черный контур.   -  person Brian Leigh    schedule 01.11.2015
comment
Вы сами создали Paintargs? Не делай этого. используйте событие Paint и запустите его с помощью Invalidate()   -  person TaW    schedule 01.11.2015
comment
Нет, я использовал вкладку событий в свойствах формы, чтобы создать ее. Что именно Invalidate() сделает в этом случае?   -  person Brian Leigh    schedule 01.11.2015
comment
Он запускает событие Paint. Это правильный способ рисования графики на элементах управления. Поэтому вместо прямого вызова всегда используйте Invalidate или Refresh ! Таким образом, также вызываются базовые события, и выполняется остальная часть необходимого.. Здесь одним из мест для вызова Invalidate является событие trckBarAngle_Scroll.   -  person TaW    schedule 01.11.2015
comment
Круто, спасибо за всю информацию!   -  person Brian Leigh    schedule 01.11.2015


Ответы (1)


Вы можете установить форму с двойной буферизацией, которая должна остановить мерцание. this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint |ControlStyles.AllPaintingInWmPaint |ControlStyles.OptimizedDoubleBuffer true); this.UpdateStyles();

В конструкторе вашей формы или методе OnLoad

Или установив для свойства DoubleBufferered значение true. Я обычно выполняю комбинацию обоих.

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

person pinkfloydx33    schedule 31.10.2015
comment
Да, я изменил его на true в свойствах формы, и это предотвратило мерцание, однако метки исчезли, а трекбар и кнопки были обведены черным контуром, хотя я не уверен, почему? - person Brian Leigh; 01.11.2015