2013-05-19 48 views
0

我制作了一个淡入淡出的表单并加载另一个表单。 当新窗体加载它时关闭启动窗体。关闭启动表单杀死应用程序

问题是什么时候它关闭了这个启动形式它杀死了我的apllication。

Public Class Splash 
Dim appearance As Boolean = False 

Private Sub Splash_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Opacity = 0 
    FadeIn.Start() 
End Sub 

Private Sub FadeIn_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FadeIn.Tick 
    If Not appearance Then 
     Opacity += 0.015 
    End If 
    If Opacity = 1 Then 
     appearance = True 
    End If 
    If appearance = True Then 
     Opacity -= 0.015 
     If Opacity = 0 Then 
      Form1.Show() 
     End If 
    End If 
End Sub 
End Class 

Public Class Form1 

Private Function WebLoad() 
    While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete 
     Application.DoEvents() 
    End While 
    Return 0 
End Function 
Private Function Login(ByVal User As String, ByVal Pass As String) 
    WebBrowser1.Navigate("http://caan/SC5/SC_Login/aspx/login_launch.aspx?SOURCE=ESOLBRANCHLIVE") 
    WebLoad() 
    WebBrowser1.Document.GetElementById("txtUserName").SetAttribute("value", User) 
    WebBrowser1.Document.GetElementById("txtPassword").SetAttribute("value", Pass) 

    Dim allImgTags As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("img") 
    If allImgTags IsNot Nothing Then 
     For Each img As HtmlElement In allImgTags 
      If img.GetAttribute("src").Contains("/images/SC5Login07.jpg") Then 
       img.InvokeMember("Click") 
       Exit For 
      End If 
     Next img 
    End If 
    Return 0 
End Function 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

    Login(user, pass) 
    WebBrowser2.Navigate("http://caan/SC5/SC_PartsCentre/aspx/partscentre_frameset.aspx") 
    WebBrowser1.Navigate("http://caan/SC5/SC_RepairJob/aspx/RepairJob_frameset.aspx") 
    Splash.Close() 
End Sub 
End Class 

我知道有一个propper初始屏幕窗体,但它不能保持足够长的时间。在其淡出它只是关闭,并启动我的应用程序

我的主要问题是我怎么停止splash.close()从关闭我的整个应用程序?

回答

现在排序这个,不会让我回答在bottem ...

用于启动画面中的VisualBasic明确规定,并增加了几行我在MSDN上搜到应用程序事件

ApplicationEvents

Namespace My 

' The following events are available for MyApplication: 
' 
' Startup: Raised when the application starts, before the startup form is created. 
' Shutdown: Raised after all application forms are closed. This event is not raised if the application terminates abnormally. 
' UnhandledException: Raised if the application encounters an unhandled exception. 
' StartupNextInstance: Raised when launching a single-instance application and the application is already active. 
' NetworkAvailabilityChanged: Raised when the network connection is connected or disconnected. 
Partial Friend Class MyApplication 
    Protected Overrides Function OnInitialize(_ 
ByVal commandLineArgs As _ 
System.Collections.ObjectModel.ReadOnlyCollection(Of String)) As Boolean 
     Me.MinimumSplashScreenDisplayTime = 7000 
     Return MyBase.OnInitialize(commandLineArgs) 
    End Function 

End Class 
End Namespace 

SplashScreen1.VB

Public NotInheritable Class SplashScreen1 
Dim appearance As Boolean = False 

Private Sub SplashScreen1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

    If My.Application.Info.Title <> "" Then 
     ApplicationTitle.Text = My.Application.Info.Title 
    Else 
     ApplicationTitle.Text = System.IO.Path.GetFileNameWithoutExtension(My.Application.Info.AssemblyName) 
    End If 

    Version.Text = System.String.Format(Version.Text, My.Application.Info.Version.Major, My.Application.Info.Version.Minor) 

    Copyright.Text = My.Application.Info.Copyright 

    Opacity = 0 
    Fade.Start() 
End Sub 

Private Sub MainLayoutPanel_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MainLayoutPanel.Paint 
End Sub 

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Fade.Tick 
    Fade.Interval = 100 
    If Not appearance Then 
     Opacity += 0.1 
    End If 

    If appearance = True Then   
     Opacity -= 0.1 
     End If 
    If Opacity = 1 Then 
     Fade.Interval = 5000 
     appearance = True 
    End If 
End Sub 
End Class 

回答

4

您应该检查Shutdown mode option在您的项目http://msdn.microsoft.com/en-us/library/tzdks800(v=vs.90).aspx的应用程序页面,并告诉我们的Shutdown modeStartup form值。我想Shutdown mode设置为When startup form closesStartup form设置为Splash

在这种情况下,请尝试将Shutdown mode设置为On last window close,它应该可以解决您的问题。

0

默认情况下,如果“启动窗体”花费的时间比“加载”的时间长,则启动屏幕保持打开两秒或更长时间。

因此,为了让您的启动画面保持打开状态,无论您需要多长时间,只需从加载到发出信号的主窗体。一种方法是使用ManualResetEvent。

在此设置中,“启动窗体”为Form1,“启动画面”为Splash,“关闭模式”为When startup form closes

在闪,我添加了一个共享的ManualResetEvent,仅表示它在形式完成动画:

Public Class Splash 

    Private appearance As Boolean = False 

    Public Shared MRE As New System.Threading.ManualResetEvent(False) 

    Private Sub Splash_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     Opacity = 0 
     FadeIn.Start() 
    End Sub 

    Private Sub FadeIn_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FadeIn.Tick 
     If Not appearance Then 
      Opacity += 0.015 
     Else 
      Opacity -= 0.015 
     End If 

     If Opacity = 1 Then 
      appearance = True 
     ElseIf Opacity = 0 Then 
      MRE.Set() 
     End If 
    End Sub 

End Class 

现在,在Form1中,我们调用了WaitOne()对共享的ManualResetEvent:

Public Class Form1 

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
     Dim MySplash As Splash = DirectCast(My.Application.SplashScreen, Splash) 
     Splash.MRE.WaitOne() ' wait for the splash to signal 

     ' ... other code ... 

    End Sub 

End Class 

现在不会出现Form1的一个,直到启动画面做动画,应用程序将有正确的Form1的“启动形式”,所以它不会关机时飞溅关闭和打开Form1中。另请注意,我们并未明确打开或关闭代码中的任何表单;这是框架本身为我们自动完成的。

使用这种方法,主窗体将不会打开,直到启动屏幕完成。此外,如果您更改动画长度,则不必进入并更改MinimumSplashScreenDisplayTime(),因为不涉及猜测。