2014-10-14 1 views
0

В верхней части Form1 я сделал:Как я могу сделать таймер, который изменит отображение изображений в pictureBox1 вперед или назад?

private bool farwardbackward; 
private FileInfo[] fi; 

Тогда у меня есть 4 кнопки мыши события:

Вперед:

private void button4_Click(object sender, EventArgs e) 
     { 
      farwardbackward = true; 
      button5.Enabled = true; 
      button6.Enabled = true; 
      timer5.Start(); 
     } 

и назад:

private void button3_Click(object sender, EventArgs e) 
     { 
      farwardbackward = false; 
      button5.Enabled = true; 
      button6.Enabled = true; 
      if (current == -1) 
       current = fi.Length; 
      timer5.Start(); 
     } 

И остановить анимацию :

private void button6_Click(object sender, EventArgs e) 
     { 
      timer5.Stop(); 
      button6.Enabled = false; 
      button5.Text = "Pause Animation"; 
      button5.Enabled = false; 
      Bitmap lastdownloadedimage = new Bitmap(fi[fi.Length -1].FullName); 
      pictureBox1.Image = lastdownloadedimage; 
     } 

И последняя кнопка пауза/продолжить:

private void button5_Click(object sender, EventArgs e) 
     { 
      b = (Button)sender; 

      if (b.Text == "Pause Animation") 
      { 
       timer5.Enabled = false; 
       b.Text = "Continue Animation"; 
      } 
      else 
      { 
       timer5.Enabled = true; 
       b.Text = "Pause Animation"; 
      } 
     } 

, а затем в timer5 случае клеща, что это интервал набора для 1000 мс я сделал:

int current = -1; 
     private void timer5_Tick(object sender, EventArgs e) 
     { 
      if (farwardbackward) 
       current = Math.Min(current + 1, fi.Length - 1); 
      else 
       current = Math.Max(current - 1, 0); 

      if (fi.Length > 0) 
      { 

       Bitmap newbmp = new Bitmap(fi[current].FullName); 
       pictureBox1.Image = newbmp; 
       pictureBox1.Refresh(); 
       newbmp.Dispose(); 
      }    
     } 

Когда я бегу моя программа I всегда видеть в pictureBox1 последнее/последнее изображение из переменной fi. Например, первое изображение в ФИ 000004.gif и последнее изображение 050122.gif Я вижу 050122.gif

Теперь то, что должно быть логики при создании изображений для отображения в pictureBox1 как анимированный GIF стиль ?

Если первый раз я нажимаю на кнопку, чтобы двигаться вперед так, что произойдет сейчас он прыгает на 000004.gif изображения, а затем показать 000005.gif и так далее ...

Если первый раз я нажимаю на обратном затем он начнет возвращаться с 050122.gif до 050121.gif и так далее ...

Проблема заключается в том, что я нажимаю на обратную сторону и после некоторых изображений нажимаю кнопку вперед, затем она продолжается с изображения, которое было и двигайтесь вперед, но затем, когда он доходит до 050122.gif, он останавливается. и он должен продолжаться без остановок. Идея состоит в том, чтобы держать его неподвижным. Я не хочу, чтобы он остановился, если добрался до 050122.gif. Если он попадает на первое изображение или последнее изображение, просто продолжайте цикл без остановки. Но по какой-то причине на 050122.gif остановитесь, если я нажимаю на кнопку «дальше», пока она движется назад.

Проблема, если я не ошибаюсь сейчас, когда я нажимаю посередине, чтобы изменить направление анимации. Затем, когда он доходит до последнего изображения или первого изображения, он останавливается. И я хочу, чтобы он продолжался без остановки, только если я нажму кнопку остановки.

Другая вещь, которую я должен делать в случае нажатия кнопки остановки? Shouldi сбросить некоторые значения или переменные?

Это timer5 код клещ событие:

int current = -1; 
     private void timer5_Tick(object sender, EventArgs e) 
     { 
      if (fi.Length > 0) 
      { 
       if (farwardbackward) 
       { 
        current = (current >= fi.Length - 1) ? 0 : current++; 
       } 
       else 
       { 
        current = (current <= 0) ? fi.Length - 1 : current--; 
       } 
       pictureBox1.Image = new Bitmap(fi[current].FullName); 
       pictureBox1.Refresh(); 
      } 
     } 

При нажатии двигаться вперед или назад я получаю же исключение: Индекс находился вне границ массива

System.IndexOutOfRangeException was caught 
    HResult=-2146233080 
    Message=Index was outside the bounds of the array. 
    Source=My Weather Station 
    StackTrace: 
     at mws.Form1.timer5_Tick(Object sender, EventArgs e) in d:\C-Sharp\Download File\Downloading-File-Project-Version-012\Downloading File\Form1.cs:line 1317 
     at System.Windows.Forms.Timer.OnTick(EventArgs e) 
     at System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m) 
     at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
     at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
     at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.Run(Form mainForm) 
     at mws.Program.Main() in d:\C-Sharp\Download File\Downloading-File-Project-Version-012\Downloading File\Program.cs:line 28 
    InnerException: 

Line 1317 is:

pictureBox1.Image = new Bitmap(fi[current].FullName); 
+0

Я не могу понять, как ваш код работает в первую очередь. Например, в вашем событии таймера вы загружаете растровое изображение * newbmp * присваиваете его * pictureBox1 *, а затем вы * распоряжаетесь * его! С помощью этого кода изображение не отображается. –

ответ

1

Я думаю, что это был бы лучший код для вашего тикового метода:

if(farwardbackward){ 
current = (current >= fi.Length-1) ? 0 : current++; 
}else{ 
current = (current <= 0) ? fi.Length-1 : current--; 
} 
picturebox1.Image = new Bitmap(fi[current].Fullname); 
picturebox1.Refresh(); 

Помимо этого, я немного изменил бы методы вашей двух кнопок.

  • Остановить таймер
  • инвертировать BOOL
  • запустить таймер снова Если вы используете этот код вы можете также удалить вторую кнопку и использовать только один! Вам просто нужно изменить свой текст.

@ γηράσκω δ»αεί πολλά διδασκόμε: ТНХ, я пропустил эту точку

Мое решение хорошо работает так:


public partial class Form1 : Form 
    { 
     private string[] fi; 
     private int current = 0; 
     private Boolean forwardbackward = true; 
     private Boolean timerRunning = true;

public Form1() { InitializeComponent(); fi = Directory.GetFiles(@"C://temp/pics"); timer1.Start(); } private void timer1_Tick(object sender, EventArgs e) { if (fi.Length > 0) { if (forwardbackward) { current = (current >= fi.Length - 1) ? 0 : ++current; } else { current = (current <= 0) ? fi.Length - 1 : --current; } pictureBox1.Image = new Bitmap(fi[current]); pictureBox1.Refresh(); } } private void btn_changeDirection_Click(object sender, EventArgs e) { timer1.Stop(); forwardbackward = (forwardbackward) ? false : true; timer1.Start(); } private void btn_Pause_Continue_Click(object sender, EventArgs e) { if (timerRunning) { timer1.Stop(); timerRunning = false; btn_Pause_Continue.Text = "Continue"; } else { timer1.Start(); timerRunning = true; btn_Pause_Continue.Text = "Pause"; } } private void btn_stop_Click(object sender, EventArgs e) { timer1.Stop(); } }

Нет идеальным решением, но это не то, что надо!

+0

Это * fi.Length - 1 * в обоих * if-else * –

+0

Jules попробовал ваше решение, нажав на кнопку, чтобы переместить назад кнопку3 или кнопку перемещения вперед4, я получаю такое же исключение: индекс находился за пределами массив. –

+0

Жюль обновил мой вопрос с сообщением об ошибке, которое я получил. –

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