2017-01-12 9 views
2

スプラッシュ画面が作成されました。私のスプラッシュ画面では、いくつかのアクションを実行するためのプログレスバーと2つのボタンがあります。ボタンをクリックすると、フォームのモジュールが完全に読み込まれ、進行状況バーに進捗状況が表示されると、それぞれのフォームが表示されます。それぞれのフォームが開くと、スプラッシュ画面が閉じられ、フォームが画面の上部に表示されます。スプラッシュ画面が閉じられると、フォームがバックグラウンドで開きます

しかし、問題はスプラッシュ画面を閉じた後、私のフォームがバックグラウンドで開いているか、フォーカスが外れてしまったと言うことができます。私はGoogleまたはstackoverflowで与えられた様々なソリューションをチェックしているが、私の問題を解決することができませんでした。

enter image description here

後に私のコードです:
私の知る限りApplication.Run(...)を覚えているようSplashScreen.cs

// <--- Data Members 

// ---> 

public SplashScreen() 
{ 
    InitializeComponent(); 
    this.Opacity = 0.0; 
    UpdateTimer.Interval = TIMER_INTERVAL; 
    UpdateTimer.Start(); 
    this.ClientSize = this.BackgroundImage.Size; 
} 

static public void ShowSplashScreen() 
{ 
    if (ms_frmSplash != null) 
    { 
     return; 
    } 

    ms_oThread = new Thread(new ThreadStart(SplashScreen.ShowForm)); 
    ms_oThread.IsBackground = true; 
    ms_oThread.SetApartmentState(ApartmentState.STA); 
    ms_oThread.Start(); 

    while (ms_frmSplash == null || ms_frmSplash.IsHandleCreated == false) 
    { 
     System.Threading.Thread.Sleep(TIMER_INTERVAL); 
    } 
} 

static public void CloseForm() 
{ 
    if (ms_frmSplash != null && ms_frmSplash.IsDisposed == false) 
    { 
     ms_frmSplash.m_dblOpacityIncrement = -ms_frmSplash.m_dblOpacityDecrement; 
    } 

    ms_oThread = null; 
    ms_frmSplash = null; 
} 

static public void SetStatus(string newStatus) 
{ 
    SetStatus(newStatus, true); 
} 

static public void SetStatus(string newStatus, bool setReference) 
{ 
    if (ms_frmSplash == null) 
    { 
     return; 
    } 

    ms_frmSplash.m_sStatus = newStatus; 

    if (setReference) 
    { 
     ms_frmSplash.SetReferenceInternal(); 
    } 
} 

static public void SetReferencePoint() 
{ 
    if (ms_frmSplash == null) 
    { 
     return; 
    } 
    ms_frmSplash.SetReferenceInternal(); 

} 

static private void ShowForm() 
{ 
    ms_frmSplash = new SplashScreen(); 
    Application.Run(ms_frmSplash); 
} 

private void SetReferenceInternal() 
{ 
    if (m_bDTSet == false) 
    { 
     m_bDTSet = true; 
     m_dtStart = DateTime.Now; 
     ReadIncrements(); 
    } 
    double dblMilliseconds = ElapsedMilliSeconds(); 
    m_alActualTimes.Add(dblMilliseconds); 
    m_dblLastCompletionFraction = m_dblCompletionFraction; 
    if (m_alPreviousCompletionFraction != null && m_iIndex < m_alPreviousCompletionFraction.Count) 
    { 
     m_dblCompletionFraction = (double)m_alPreviousCompletionFraction[m_iIndex++]; 
    } 
    else 
    { 
     m_dblCompletionFraction = (m_iIndex > 0) ? 1 : 0; 
    } 
} 

private double ElapsedMilliSeconds() 
{ 
    TimeSpan ts = DateTime.Now - m_dtStart; 
    return ts.TotalMilliseconds; 
} 

private void ReadIncrements() 
{ 
    string sPBIncrementPerTimerInterval = SplashScreenXMLStorage.Interval; 
    double dblResult; 

    if (Double.TryParse(sPBIncrementPerTimerInterval, System.Globalization.NumberStyles.Float, System.Globalization.NumberFormatInfo.InvariantInfo, out dblResult) == true) 
    { 
     m_dblPBIncrementPerTimerInterval = dblResult; 
    } 
    else 
    { 
     m_dblPBIncrementPerTimerInterval = .0015; 
    } 

    string sPBPreviousPctComplete = SplashScreenXMLStorage.Percents; 

    if (sPBPreviousPctComplete != "") 
    { 
     string[] aTimes = sPBPreviousPctComplete.Split(null); 
     m_alPreviousCompletionFraction = new ArrayList(); 

     for (int i = 0; i < aTimes.Length; i++) 
     { 
      double dblVal; 
      if (Double.TryParse(aTimes[i], System.Globalization.NumberStyles.Float, System.Globalization.NumberFormatInfo.InvariantInfo, out dblVal) == true) 
      { 
       m_alPreviousCompletionFraction.Add(dblVal); 
      } 
      else 
      { 
       m_alPreviousCompletionFraction.Add(1.0); 
      } 
     } 
    } 
    else 
    { 
     m_bFirstLaunch = true; 
     m_sTimeRemaining = ""; 
    } 
} 

private void StoreIncrements() 
{ 
    string sPercent = ""; 
    double dblElapsedMilliseconds = ElapsedMilliSeconds(); 
    for (int i = 0; i < m_alActualTimes.Count; i++) 
    { 
     sPercent += ((double)m_alActualTimes[i]/dblElapsedMilliseconds).ToString("0.####", System.Globalization.NumberFormatInfo.InvariantInfo) + " "; 
    } 

    SplashScreenXMLStorage.Percents = sPercent; 
    m_dblPBIncrementPerTimerInterval = 1.0/(double)m_iActualTicks; 
    SplashScreenXMLStorage.Interval = m_dblPBIncrementPerTimerInterval.ToString("#.000000", System.Globalization.NumberFormatInfo.InvariantInfo); 
} 

public static SplashScreen GetSplashScreen() 
{ 
    return ms_frmSplash; 
} 

private void UpdateTimer_Tick(object sender, System.EventArgs e) 
{ 
    if (Program.isRadarSelected) 
    { 
     if (count >= 100) 
     { 
      UpdateTimer.Stop(); 
      this.Close(); 
     } 
     else 
     { 
      updateProgressBar(); 
      count += 5; 
     } 
    } 

    if (m_dblOpacityIncrement > 0) 
    { 
     m_iActualTicks++; 
     if (this.Opacity < 1) 
     { 
      this.Opacity += m_dblOpacityIncrement; 
     } 
    } 
    else 
    { 
     if (this.Opacity > 0) 
     { 
      this.Opacity += m_dblOpacityIncrement; 
     } 
     else 
     { 
      StoreIncrements(); 
      UpdateTimer.Stop(); 
      this.Close(); 
     } 
    } 
} 

private void updateProgressBar() 
{ 

    SplashScreen.SetStatus("Loading : " + count + " %"); 

    statusLabel.Text = m_sStatus; 
    m_dblLastCompletionFraction += m_dblPBIncrementPerTimerInterval; 

    int width = (int)Math.Floor(statusPanel.ClientRectangle.Width * m_dblLastCompletionFraction); 
    int height = statusPanel.ClientRectangle.Height; 
    int x = statusPanel.ClientRectangle.X; 
    int y = statusPanel.ClientRectangle.Y; 

    if (width > 0 && height > 0) 
    { 
     m_rProgress = new Rectangle(x, y, width, height); 
     if (!statusPanel.IsDisposed) 
     { 
      Graphics g = statusPanel.CreateGraphics(); 
      LinearGradientBrush brBackground = new LinearGradientBrush(m_rProgress, Color.FromArgb(58, 96, 151), Color.FromArgb(181, 237, 254), LinearGradientMode.Horizontal); 
      g.FillRectangle(brBackground, m_rProgress); 
      g.Dispose(); 
     } 
    } 
} 

private void RadarSelectionButton_Click(object sender, EventArgs e) 
{ 
    Program.isButtonClicked= true; 
} 

Program.csの

internal static class Program 
{ 
    public static bool isButtonClicked= false; 

    [STAThread] 
    private static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     SplashScreen.ShowSplashScreen(); 
     Application.DoEvents(); 

     while (!isButtonClicked) 
     { 
      System.Threading.Thread.Sleep(50); 
     } 

     Application.Run(new MyForm()); 
     SplashScreen.CloseForm(); 
    } 
} 

答えて

1

、meaninをブロックしていますあなたのスプラッシュスクリーンは、メインウィンドウが閉じられる前に決して閉じることはありません。以下のコードを試すことができます。それがどうなるか教えてください。

あなたはCloseFormメソッドに関して、どのように動作させるのかはっきりしていません。あなたがやっているのは不透明度を設定することだけですか?しかし、これを書いている限り、あなたの問題ではありません。しかし、Application.Run(..)が終了する前にスプラッシュ画面のメインウィンドウを閉じるように通知する必要があると私は思っています。 また、ShowSplashScreenメソッドのwhileループ。どうして?スレッド間の待機とシグナリングにはManualResetEventのようなものを使用することを検討してください。ポーリングよりもむしろイベントを待つほうが良い。

+0

Thanx alot @Michael ...それは私のために働いた.. – Rish

関連する問題