2013-06-20 4 views
0

У меня есть SplashScreen, MainForm.Показать SplashScreen при загрузке содержимого формы

На моем MainForm_Load У меня есть метод с именем Connect();. Эти методы подтверждают подключение моего RFID-устройства к SerialPort, и для завершения требуется несколько секунд.

Пока он проходит через метод Connect(), я хочу показать SplashScreen. Я попытался это:

private void Main_Load(object sender, EventArgs e) 
{ 
    Frm_Splash s = new Frm_Splash(); 
    s.Show(); 
    Connect();    
} 

Connect(); метод, показывает сообщение, используя MessageBox. Но когда SplashScreen закончился, он закрывается и закрывает MessageBox.

Вот мой SplashScreen код формы:

private void timer1_Tick(object sender, EventArgs e) 
{ 
    if (pbLoad.Value < 100) 
     { 
      pbLoad.Value = pbLoad.Value + 1; 
     } 
    else 
     { 
      timer1.Enabled = false; 
      this.Close(); 
     } 
} 

Я знаю, что есть что-то делать с this.Close();. Я просто не знаю, как это исправить.

Может быть, если я использую this.Visible = false, но тогда SplashScreen не будет закрываться, он все равно будет обрабатываться, просто будет невидимым ... Я думаю, что есть лучший вариант.

+1

Кажется, что-то еще. Если 'SplashScreen' - это собственная форма, то закрытие его не может закрывать' MessageBox', созданное из другой формы. – DonBoitnott

+0

@DonBoitnott Я попробовал 'this.visible = false' вместо' this.Close() 'и работал. Но я знаю, что SplashScreen все еще обрабатывается, это просто неразумно. Есть ли у вас предложения ? – Ghaleon

+0

Действительно ли это закрывает окно сообщения или перетаскивает его на задний план? Можете ли вы попытаться свести к минимуму вещи или вкладку alt, чтобы увидеть, все ли там окно сообщений, но скрывается? – BlargleMonster

ответ

4

Я полагаю, что вы открываете MessageBox с помощью MessageBox.Show() ... Вместо этого, используйте MessageBox.Show(this,"message");

Я представляю себе, что происходит ваш MessageBoxes родитель установлен в заставках, как это диалоговое окно с фокусом

+0

Работал отлично! Не могли бы вы объяснить мне, почему этот параметр? – Ghaleon

+1

[См. Это] (http://msdn.microsoft.com/en-us/library/cked7698.aspx) - В основном у вашего MessageBox был неправильный родитель, он должен взять родителя из любого диалогового окна с фокусом во время его показан – Sayse

+0

+1 спасибо за объяснение. – Ghaleon

1

Вот мой заглавный экран:

namespace MyNamespace 
{ 
    public partial class frmSplashScreen : Form 
    { 
     private static frmSplashScreen splashScreen = null; 
     private static Thread splashThread = null; 
     private Double opacityInc = .03; 
     private Double opacityDec = .1; 
     private const Int32 iTimerInterval = 30; 

     public frmSplashScreen() 
     { 
      InitializeComponent(); 

      Opacity = .0; 
      timer1.Interval = iTimerInterval; 
      timer1.Start(); 
     } 

     private void frmSplashScreen_Load(Object sender, EventArgs e) 
     { 
      CenterToScreen(); 
     } 

     public static void ShowSplashScreen() 
     { 
      if (splashScreen != null) 
       return; 
      splashThread = new Thread(new ThreadStart(frmSplashScreen.ShowForm)); 
      splashThread.IsBackground = true; 
      splashThread.SetApartmentState(ApartmentState.STA); 
      splashThread.Start(); 
     } 

     private static void ShowForm() 
     { 
      splashScreen = new frmSplashScreen(); 
      Application.Run(splashScreen); 
     } 

     public static void CloseForm() 
     { 
      if (splashScreen != null) 
       splashScreen.opacityInc = -splashScreen.opacityDec; 
      splashThread = null; 
      splashScreen = null; 
     } 

     private void timer1_Tick(Object sender, EventArgs e) 
     { 
      if (opacityInc > 0) 
      { 
       if (Opacity < 1) 
        Opacity += opacityInc; 
      } 
      else 
      { 
       if (Opacity > 0) 
        Opacity += opacityInc; 
       else 
        Close(); 
      } 
     } 
    } 
} 

Я активировать его, вызывая это в конструкторе формы, где я хочу, чтобы это выскочит из:

frmSplashScreen.ShowSplashScreen(); 

Затем закройте его в Shown той же формы:

frmSplashScreen.CloseForm(); 

ПРИМЕЧАНИЕ: Я предлагаю это, потому что в нем используется static, что помогает облегчить проблемы с владением.

+0

Спасибо! Я попытаюсь улучшить некоторые из своих кодов в моем. +1 – Ghaleon

+0

[Кредит, в котором должен быть предоставлен кредит) (http://www.codeproject.com/Articles/5454/A-Pretty-Good-Splash-Screen-in-C) Don ...;) – Sayse

+0

@Sayse. Я признаю, что он был из интернет-источника, но не тот. Мое предположение ... это было сделано раундами совсем немного. Это хороший код. – DonBoitnott