winforms Windows窗体未停留在屏幕上

daolsyd0  于 2023-11-21  发布在  Windows
关注(0)|答案(2)|浏览(138)

Visual Studio 2022. VB.NET. Windows窗体。两个窗体。Splash和免责声明。Splash窗体应在屏幕上停留3秒,卸载并加载免责声明。Splash窗体工作得很好,但免责声明不停留在屏幕上的下一个动作.现在免责声明形式是空的.我已经添加了一个计时器控件在飞溅的形式和代码如下.免责声明形式停留在屏幕上,如果我使它启动表单并运行项目。

Private Sub timerSplash_Tick(sender As Object, e As EventArgs) Handles timerSplash.Tick
    timerSplash.Stop()

    Me.Close()

    Dim disclaimerForm As New Disclaimer()
    disclaimerForm.ShowDialog()
End Sub

字符串

s8vozzvw

s8vozzvw1#

这不是对问题本身的回答,而是显示初始屏幕的另一种方法,比这里使用的方法更好。
我最初在几年前实现了这个想法,为C#应用程序提供闪屏功能,其行为有点像通过应用程序框架内置到VB应用程序中的闪屏功能。去here查看原始C#代码并阅读一些有关原理的解释。
下面是该代码的VB实现。将一个新表单添加到名为SplashScreen的项目中,并添加以下代码:

Imports System.Threading
Imports Timer = System.Timers.Timer

Public Class SplashScreen

    Private Structure SplashScreenInfo
        Public StartupForm As Form
        Public MinimumDisplayTime As Integer
        Public Handle As ManualResetEvent
    End Structure

    Private timer As New Timer
    Private minimumDisplayTimeExpired As Boolean = False
    Private syncRoot As New Object
    Private closeHandle As ManualResetEvent

    Private Sub New(startupForm As Form, minimumDisplayTime As Integer)
        InitializeComponent()

        AddHandler startupForm.Load, AddressOf startupForm_Load

        AddHandler timer.Elapsed, AddressOf timer_Elapsed
        timer.Interval = minimumDisplayTime
        timer.Start()
    End Sub

    Public Shared Sub DisplaySplashScreen(startupForm As Form, minimumDisplayTime As Integer)
        Dim continueHandle As New ManualResetEvent(False)

        Call New Thread(AddressOf DisplaySplashScreen).Start(New SplashScreenInfo With
                                                             {
                                                                 .StartupForm = startupForm,
                                                                 .MinimumDisplayTime = minimumDisplayTime,
                                                                 .Handle = continueHandle
                                                             })

        continueHandle.WaitOne()
    End Sub

    Private Shared Sub DisplaySplashScreen(info As Object)
        Dim ssi = DirectCast(info, SplashScreenInfo)
        Dim SplashScreen As New SplashScreen(ssi.StartupForm, ssi.MinimumDisplayTime)

        ssi.Handle.Set()

        Application.Run(SplashScreen)
    End Sub

    Private Sub startupForm_Load(sender As Object, e As EventArgs)
        SyncLock syncRoot
            If (Not minimumDisplayTimeExpired) Then
                closeHandle = New ManualResetEvent(False)
            End If
        End SyncLock

        If (closeHandle IsNot Nothing) Then
            closeHandle.WaitOne()
        End If

        Invoke(New MethodInvoker(AddressOf Close))
    End Sub

    Private Sub timer_Elapsed(sender As Object, e As Timers.ElapsedEventArgs)
        SyncLock syncRoot
            If closeHandle Is Nothing Then
                minimumDisplayTimeExpired = True
            Else
                closeHandle.Set()
            End If
        End SyncLock
    End Sub

End Class

字符串
该代码处理启动表单的Load事件,并阻止事件处理程序完成,直到等待句柄被触发。请注意,此事件处理程序将始终在表单自己的Load事件处理程序之后执行,如果有一个,因此,在该事件处理程序中初始化表单的任何工作都将在等待之前完成。闪屏窗体引发其Elapsed事件。该事件发生的时间在您首先调用DisplaySplashScree时指定。
将一个名为Program的模块添加到项目中,并添加以下代码:

Module Program

    <STAThread>
    Sub Main()
        Application.EnableVisualStyles()
        Application.SetCompatibleTextRenderingDefault(False)

        Dim startupForm = New Form1

        SplashScreen.DisplaySplashScreen(startupForm, 3000)

        Application.Run(startupForm)
    End Sub

End Module


这假设您的项目中有一个Form1表单,您希望它成为主/启动表单。它会创建启动表单,然后显示闪屏,然后使用指定的启动表单启动应用。如上所述,该启动表单将被初始化,但直到闪屏关闭时才会显示,在本例中,闪屏关闭是在3000毫秒后。
您需要在项目属性中禁用应用程序框架,并将启动对象设置为Sub Main,以使该模块成为应用程序的入口点。
我忘了提到这段代码的一个主要前提。启动画面是在启动表单的不同线程上创建和显示的,就像VB应用程序框架一样。这一点是,它实际上使启动画面能够做它们最初打算做的事情:给给予用户一些东西看,而应用程序是初始化。如果你显示闪屏调用ShowDialog的UI线程,那么这将阻止并阻止你这样做在启动表单中进行任何进一步的工作。如果启动表单实际上没有做任何事情,启动屏幕只是一个广告牌,这很好。如果启动表单中实际上发生了初始化,则需要在不同的线程上创建启动屏幕,因此UI线程可以自由地完成这项工作。

pn9klfpd

pn9klfpd2#

您需要在打开新对话框后关闭启动画面,而不是在此之前。否则,如果这是唯一的窗体,应用程序将关闭。
而不是

Private Sub timerSplash_Tick(sender As Object, e As EventArgs) Handles timerSplash.Tick
    timerSplash.Stop()

    Me.Close()

    Dim disclaimerForm As New Disclaimer()
    disclaimerForm.ShowDialog()
End Sub

字符串
......做这个......

Private Sub timerSplash_Tick(sender As Object, e As EventArgs) Handles timerSplash.Tick
    timerSplash.Stop()

    Dim disclaimerForm As New Disclaimer()
    disclaimerForm.ShowDialog()

    Me.Close()
End Sub


如果你不想显示splash窗体,请使用Show而不是ShowDialog。确保将关机模式也设置为OnLastWindowClose

相关问题