Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0405: Einen Splash-Screen einbinden

 von 

Beschreibung 

Jede Anwendung die etwas auf sich hält, hat ihn, den Splash-Screen. Dieser Tipp vermisst also die Desktopgröße und positioniert ein mit Bild versehehens Fenster vor das zu startende, eigene und eigentliche Programm.

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Verwendete API-Aufrufe:

SHAppBarMessage, SetWindowPos

Download:

Download des Beispielprojektes [11,21 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Timersteuerelement "Timer1"
Option Explicit

Private Sub Form_Activate()
    If Form2.SplashLoaded Then
        Timer1.Interval = 500
        Timer1.Enabled = True
    End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Unload Form1
    Unload Form2
End Sub

Private Sub Timer1_Timer()
    Timer1.Enabled = False
    Unload Form2
    Form2.SplashLoaded = False
End Sub



'---------- Ende Formular "Form1" alias Form1.frm  ----------
'--------- Anfang Formular "Form2" alias Form2.frm  ---------
' Steuerelement: Bildfeld-Steuerelement "Picture1"
' Steuerelement: Timersteuerelement "Timer1" auf Picture1

Option Explicit

Private Declare Function SetWindowPos Lib "user32" _
       (ByVal hwnd As Long, ByVal hWndInsertAfter As _
       Long, ByVal x As Long, ByVal y As Long, ByVal _
       cx As Long, ByVal cy As Long, ByVal wFlags As _
       Long) As Long
        
Private Declare Function SHAppBarMessage Lib "shell32.dll" _
        (ByVal dwMessage As Long, pData As APPBARDATA) As _
        Long
                
Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

Private Type APPBARDATA
    cbSize As Long
    hwnd As Long
    uCallbackMessage As Long
    uEdge As Long
    rc As RECT
    lParam As Long
End Type

Const ABM_GETTASKBARPOS As Long = &H5&

Const SWP_NOMOVE As Long = 2&
Const SWP_NOSIZE As Long = 1&
Const SWP_FLAGS As Long = SWP_NOMOVE Or SWP_NOSIZE
Const HWND_TOPMOST As Long = -1&
Const HWND_NOTOPMOST As Long = -2&

Public SplashLoaded As Boolean

Private Sub Form_Activate()
    Timer1.Enabled = True
End Sub

Private Sub Form_Load()
    Dim sW As Long, sH As Long
    Dim dW As Long, dH As Long
    Dim TPos As APPBARDATA
    Dim TPX As Integer, TPY As Integer
    
    Picture1.Picture = LoadPicture(App.Path & "\Startlogo.gif")
    
    TPX = Screen.TwipsPerPixelX
    TPY = Screen.TwipsPerPixelY
    
    Call SHAppBarMessage(ABM_GETTASKBARPOS, TPos)
    
    sW = Screen.Width / TPX
    sH = Screen.Height / TPY
    
    If TPos.rc.Right >= sW Then
        dW = sW * TPX
        dH = (sH - (TPos.rc.Bottom - TPos.rc.Top)) * TPY
    Else
        dH = sH * TPY
        dW = (sW - (TPos.rc.Left - TPos.rc.Right)) * TPX
    End If
    
    Me.Left = (dW - Me.Width) / 2
    Me.Top = (dH - Me.Height) / 2
    Me.Show
    Call SetWindowPos(Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_FLAGS)
    
    SplashLoaded = True
    
    Timer1.Enabled = False
    Timer1.Interval = 500
End Sub

Private Sub Timer1_Timer()
    Timer1.Enabled = False
    Form1.Show
End Sub

'---------- Ende Formular "Form2" alias Form2.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 4 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Moses am 24.08.2005 um 10:35

Bei mir funktionierts nicht.... (VB6, Windows 2000 SP4)

Ist nicht die Mitte des Fensters mit StartUpPosition = Fenstermitte gewährleistet??

Kommentar von Defender am 04.12.2001 um 08:44

Also um noch mal auf die kompliziertheit zurück zu kommen:
Ich glaube das mit dieser Lösung ebenfalls gewährleistet ist das der Splashscreen,
1) In der Mitte ist und
2) nicht verdeckt wird.
Hier der Source Code:
'------- Hauptmenü -------
Private Sub Form_Load()
Load Splashscreen
Splashscreen.Show
Me.Hide
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim Antwort
Antwort = MsgBox("Wollen Sie wirklich beenden ?", vbQuestion + vbYesNo, "Beenden ?")
If Antwort = vbYes Then End
End Sub
'----- Splashscreen ----
Public Zähler As Integer
Private Sub Form_Load()
Zähler = 0
Timer1.Interval = 1000
Dim WWidth, HHeight
WWidth = (Screen.Width / 2) - (Splashscreen.Width / 2)
HHeight = (Screen.Height / 2) - (Splashscreen.Height / 2)
Me.Top = HHeight: Me.Left = WWidth
End Sub
Private Sub Timer1_Timer()
Zähler = Zähler + 1
If Zähler = 2 Then
Unload Me
Me.Hide
Form1.Show
Timer1.Enabled = False
End If
End Sub

Kommentar von Bard am 07.11.2001 um 18:20

So kompliziert, damit sichergestellt ist, dass der Splash-Screen in der Mitte des nutzbaren Bildschirmbereiches vor allen anderen Fenstern angezeigt wird.
Würde man es weniger "kompliziert" machen, würde das Fenster sehr schnell von anderen Anwendungen verdeckt werden.

Kommentar von Egal am 26.09.2001 um 16:29

Warum so kompliziert???