2

Мне просто интересно, можете ли вы помочь мне с этой проблемой.Как перерисовать линию, используя значения из trackBar в реальном времени?

В моей программе я должен использовать событие paint, чтобы нарисовать линию, которая действует как «башня». Я должен использовать трекбор, чтобы выбрать угол, на котором я буду «стрелять» этой башней. Моя проблема заключается в том, что я не уверен, как закодировать его так, чтобы линия «Турель» перерисовывалась каждый раз при изменении значения в трекбаре. Я попробовал использовать 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); 
      } 
     } 
+0

Форма.DoubleBuffered = true. – TaW

+0

Я изменил это в свойствах форм, но, к сожалению, это не изменило ситуацию. Что именно должно было измениться? Я новичок в C#, так что извините за вопросы noob. –

+0

Он должен остановить мерцание. – TaW

ответ

0

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

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

Или, установив DoubleBufferered свойство верно. Обычно я выполняю комбинацию обоих.

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

+0

Да, я изменил его на true в свойствах формы, и это предотвратило мерцание, однако метки исчезли, а трекбард и кнопки имели черный контур вокруг них, я не уверен, почему? –

Смежные вопросы