2013-11-13 3 views
0

Я использую Visual Studio 2013 для создания приложения Visual C# Windows Forms, и я не использую конструктор для настройки формы.Timer in C# WinForms Приложение не функционирует должным образом

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

Любая помощь была бы принята с благодарностью.

using System; 
using System.Drawing; 
using System.Drawing.Imaging; 
using System.Collections; 
using System.ComponentModel; 
using System.Windows.Forms; 
using System.Data; 
using System.Timers; 

namespace SimpleForm 
{ 

    public class TheForm : Form 
    { 

     private MenuStrip menuStrip; 
     private MainMenu menuMain; 
     private MenuItem menuBlockFile; 
     private MenuItem menuBlockOthers; 
     private MenuItem menuItemExit; 
     private MenuItem menuItemHints; 

     static Bitmap imgIntroBg = null; 
     static Bitmap imgMenuBg = null; 

     private Panel pnlIntro; 
     private Panel pnlMenu; 

     static int counter = 1; 
     static System.Timers.Timer timer; 

     public TheForm() 
     { 

      FormInitialize(); 

      MenuInitialize(); 

      introDisplay(); 

      MenuDisplay(true); 

     } 

     private void FormInitialize() 
     { 

      System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Game)); 

      this.SuspendLayout(); 

      this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); 
      this.ClientSize = new System.Drawing.Size(714, 462); 
      this.FormBorderStyle = FormBorderStyle.FixedDialog; 
      this.Name = "SimpleForm"; 
      this.Text = "Simple Form"; 
      ControlBox = false; 
      BackColor = System.Drawing.Color.Black; 
      StartPosition = FormStartPosition.CenterScreen; 

      this.ResumeLayout(false); 

     } 


     private void MenuInitialize() 
     { 

      this.SuspendLayout(); 

      this.menuStrip = new MenuStrip(); 
      this.menuMain = new MainMenu(); 
      this.menuBlockFile = new MenuItem(); 
      this.menuBlockOthers = new MenuItem(); 

      this.menuItemExit = new MenuItem(); 
      this.menuItemHints = new MenuItem(); 

      this.menuMain.MenuItems.AddRange(new MenuItem[] { 
       this.menuBlockFile, 
       this.menuBlockOthers}); 

      this.menuBlockFile.Index = 0; 
      this.menuBlockFile.MenuItems.AddRange(new MenuItem[] { 
       this.menuItemExit 
      }); 
      this.menuBlockFile.Text = "File"; 

      this.menuBlockOthers.Index = 1; 
      this.menuBlockOthers.MenuItems.AddRange(new MenuItem[] { 
       this.menuItemHints 
      }); 
      this.menuBlockOthers.Text = "Others"; 

      this.menuItemExit.Index = 0; 
      this.menuItemExit.Text = "Exit"; 
      this.menuItemExit.Click += new System.EventHandler(this.menuItemExit_Click); 

      this.menuItemHints.Checked = true; 
      this.menuItemHints.Index = 0; 
      this.menuItemHints.Text = "Temp"; 
      this.menuItemHints.Click += new System.EventHandler(this.menuItemExit_Click); 

      this.Menu = this.menuMain; 

      imgMenuBg = new Bitmap("graphics/layout/menubg.png"); 
      pnlMenu = new Panel(); 
      pnlMenu.Name = "pnlMenu"; 
      pnlMenu.Location = new Point(0, 0); 
      pnlMenu.Width = 714; 
      pnlMenu.Height = 462; 
      pnlMenu.BackgroundImage = imgMenuBg; 

      MenuDisplay(false); 

      this.ResumeLayout(false); 

     } 

     private void MenuDisplay(bool display) 
     { 

      this.menuBlockFile.Visible = display; 
      this.menuBlockOthers.Visible = display; 
      if (display == true) { 
       Controls.Add(pnlMenu); 
      } else { 
       Controls.Remove(pnlMenu); 
      } 

     } 

     private void introDisplay() 
     { 

      timer = new System.Timers.Timer(); 
      timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); 
      timer.Interval = 5*1000; 
      timer.Enabled = true; 

      imgIntroBg = new Bitmap("graphics/layout/Introbg.png"); 
      pnlIntro = new Panel(); 
      pnlIntro.Name = "pnlIntro"; 
      pnlIntro.Location = new Point(0, 0); 
      pnlIntro.Width = 714; 
      pnlIntro.Height = 482; 
      pnlIntro.BackgroundImage = imgIntroBg; 

      timer.Start(); 

      Controls.Add(pnlIntro); 

      while (counter != 0) 
      { 

      } 

      Controls.Remove(pnlIntro); 

     } 

     private static void timer_Elapsed(object source, ElapsedEventArgs e) 
     { 
      counter = 0; 
      timer.Stop(); 
     } 

     private void menuItemExit_Click(object sender, System.EventArgs e) 
     { 
      Application.Exit(); 
     } 

    } 

} 

ответ

4

while(counter != 0) часть это - неправильный предмет. Обратный вызов timer_Elapsed будет запущен, когда таймер будет выполнен, поэтому вы добавите изображение (Controls.Add(plnIntro);), а затем подождите, пока обратный вызов таймера не загорится. Вот тогда и закончилось. В этот момент просто удалите plnIntro, и он должен делать это по своему усмотрению.

Вам не нужно фиксировать нить петлей while, чтобы она работала.

Попробуйте удалить:

while (counter != 0) 
{ 

} 

Controls.Remove(pnlIntro); 

И поставил Controls.Remove(pnlIntro); в функцию обратного вызова таймера:

private void timer_Elapsed(object source, ElapsedEventArgs e) 
{ 
    Controls.Remove(pnlIntro); 
    timer.Stop(); 
} 
+0

Для меня, что воспитывает пару ошибок на линии «Controls.Remove (pnlIntro); ». Один из них: «Ссылка на объект требуется для нестатического поля, метода или свойства« System.Windows.Forms.Control.Controls.get », а вторая -« Ссылка на объект требуется для нестатического поля, метод или свойство «SimpleForm.TheForm.pnlIntro». – RebDev

+0

Извините, не заметил, что обратный вызов timer_Elapsed был статичным, исправится в ответ! :) – Jite

+0

Кроме того, объект таймера не обязательно должен быть статическим, я бы даже предположил, что он не должен быть статическим. – Jite

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