2017-01-12 6 views
2

시작 화면을 만들었습니다. 내 스플래시 화면에서 진행 막대와 두 개의 단추를 사용하여 작업을 수행했습니다. 버튼 클릭시, 해당 양식의 모듈이 완전히로드되고 나면 해당 양식이 표시되고 진행률 막대에 진행률이 표시됩니다. 해당 양식이 열리면 스플래시 화면이 닫히고 양식이 화면 상단에 표시됩니다.스플래시 화면이 닫히면 양식이 백그라운드에서 열림

하지만 문제는 스플래시 화면을 닫은 후 내 양식이 백그라운드로 열리거나 발생하지 않아야하는 포커스를 벗어날 수 있다는 것입니다. 구글이나 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 g 메인 윈도우가 닫히기 전에 스플래시 화면이 절대로 닫히지 않을 것입니다. 아래 코드를 시도해 볼 수 있습니다. 어떻게 진행되는지 알려주세요.

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); 
     } 

     var window = new MyForm(); 
     window.Load += (s, e) => 
     {   
      SplashScreen.CloseForm(); 
      window.Activate(); 
     } 
     Application.Run(window); 

    } 
} 

귀하는 CloseForm 방법에 대해 어떻게 작동하는지 확신 할 수 없습니다. 당신이하고있는 유일한 일은 불투명도를 설정하는 것입니까? 그러나이 글을 쓰는 한 당신의 문제는 아닙니다. 그러나 Application.Run(..)이 종료되기 전에 스플래시 화면의 주 윈도우에 신호를 보내야한다고 생각합니다. 또한 ShowSplashScreen 메서드의 while 루프; 왜? 스레드 간의 대기 및 신호 처리에는 ManualResetEvent과 같은 것을 사용하는 것이 좋습니다. 폴링보다는 이벤트를 기다리는 것이 항상 좋습니다.

+0

고맙습니다 @ 마이클 ... 그것은 나를 위해 일했습니다 .. – Rish