SplashScreen nicht nur MDI/SDI sondern auch Dialogbasierende Anwendung!



  • Hi Zusammen!

    Ich hab irgendwo, weiss nicht mehr recht wo, gelesen, dass Splashscreens ganz einfach über ADD TO PROJECT -> VISUAL C++ COMPONENTS -> SplashScreen eingefügt werden können und das dies nur in MDI/SDI funktioniert.

    Und was ist nun mit leuten, die gerne Dialogbasierende Anwendungen schreiben möchten oder werden? Kein problem! Es ist zwar ein bisschen Umständlicher, doch es geht! Folglich mein kleines Tutorial zu "SplashScreen in einer Dialogbasierende Anwendung", eigentlich für das FAQ gedacht:

    Tutorial (Step by Step) - Wie erstelle ich SplashScreens in einer Dialogbasierenden MFC Anwendung?

    Es geht eigentlich sehr einfach, folglich Schrittweise erklärt.

    1. Erstelle ein neues Dilaogbasierendes MFC-Projekt. Der Assistent erstellte nun ein Dilaog namens CirgendwasDlg. Dort befindet sich auch die Funktion WM_PAINT in der Klasse.

    2. Lasse ein Bitmap (256 Farben!!) importieren oder erstelle
    selbst eines. Das ist dann das "SplashScreen-Logo". Nun wechsle wieder zum "CIrgendwasDlg" und lösche alle Steuerelemnte wie "OK, CANCEL" und den Text, das Dialogfeld muss blanco sein.

    3. Füge das Steuerelement "Picture" in den Dialog ein. Wähle in den "Controlleigenschaften" von Picture den Typ BITMAP aus und wähle als Bitmap das eingefügte Bitmap also IDB_BITMAP1

    4. Nun schiebe das Kontrollfeld mit dem anzeigenden Bitmap ganz in
    die Ecke des Dialogfeldes und danach passe den Dialog dem
    Bitmap an, ebenfalls fügst du der Klasse "CIrgendwasDlg" mit hilfe des Klassenassitenten die Funktion WM_TIMER hinzu.

    5. Füge in der Funktion OnTimer... folgender Code hinzu:

    Sleep(5000); //Anzeigezeit des Screens
    KillTimer(TRUE);
    CirgendwasDlg::PostMessage(WM_QUIT);
    CHauptDlg dlg; //CHauptDlg so lassen, das wird der normale Dialog werden
    dlg.DoModal(); //Aufrufen des Dialogs
    

    6. Gehe in die Dialogressourcen und füge einen neuen Dialog ein.
    Diesen benennst du als IDD_HauptDlg.
    Erstelle zudem noch eine neue MFC Klasse "CHauptDlg" mit der Bais CDialog,
    abgeleitet von IDD_HauptDlg. In diesem CHauptDlg schreibst du nun dein Normales Programm, als wäre das der erste erstellte Dialog.

    7. Wechsle nun wieder zum ersten Dialog namens "CirgendwasDlg", und gehe in der Klasse zur Funktion ***OnPaint()***. In einer ELSE-ANWEISUNG findest du den Code CDialog::OnPaint();. Nach dieser Zeile fügst du eine weitere Zeile mit folgendem Code hinzu:

    SetTimer(0,0,NULL);
    

    8. Im CIrgendwasDlg fügst du noch #include "HauptDlg.h", in der Klasse von CHauptDlg #include "CIrgendwasDlg.h" hinzu. Das SplashScreen wird beim start nun 5 Sekunden angezeigt und danach startet das Programm.
    Im CHauptDlg Dialog kannst du nun dein Programm schreiben, respektive
    fortführen!

    Diese 5 Sekunden kannst du in WM_TIMER unter Sleep(); beliebig ändern. Angegeben wird in Millisekunden

    Dieses Tutorial wurde geschrieben von Programmer,
    Viel Spass beim Ausprobieren, 😃

    mfg
    Pro

    PS: Wäre was für das FAQ!



  • Kann das bitte jemand austesten, hab momentan absolut keine Zeit.



  • hm... wäre eigentlich als ergänzung zu "BEgerüssungsbildschirm" im FAQ gedacht.. *gg* 😃



  • Programmer schrieb:

    hm... wäre eigentlich als ergänzung zu "BEgerüssungsbildschirm" im FAQ gedacht.. *gg* 😃

    I know, mir hat bisher aber noch niemand bestätigt, dass das auch funktioniert ...



  • mh.... das ganze funz ganz gut.... nur mit dem sleep haut nicht so ganz da in der zeit das ganze fenster hängt... besser ist das mit timer...

    iTime (int) hinzufügen;
    timer hinzufügen (ID_TIMER)

    void CSplashDlg::OnTimer(UINT nIDEvent) 
    {
    	if(nIDEvent==ID_TIMER) 
    	{
    		iTime++;
    		if(iTime==5) //wie lange soll der splash angezeigt werden
    		{
    			KillTimer(TRUE);
    			CirgendwasDlg::PostMessage(WM_QUIT); //Splash schliessen
    			//hier kommt der aufruf dür den neuen dialog
    		}
    	}
    CDialog::OnTimer(nIDEvent);
    }
    

    und in die OnPaint:

    else
    	{
    		CDialog::OnPaint();
    		SetTimer(ID_TIMER,1000,NULL); //Timer in 1sec schritten
    
    	}
    

    das einige was halt nicht geht ... ist das mit dem dialog aufrufen... das macht der einfach ned...

    Joat



  • Hast ev Dialogklassen verwechselt oder so?
    *g*

    Ich weiss es nicht, doch bei mir funzt alles... 🙂



  • nö hab ich nicht 😃

    ich habs mit msgboxen durchprobiert... nur kommt der nie dort an... alles was nach CirgendwasDlg::PostMessage(WM_QUIT); wird nicht ausgeführt....

    es hängt irgendwie an:

    CSplashDlg::PostMessage(WM_QUIT);

    wenn ich das auskommentiere funz das nur das dann das splash fenster nicht weggeht.....

    JOat



  • Ist keine gute Lösung da ein SplashScreen angezeigt wird während die Hauptapplikation startet.
    Man muss den SplashScreen im Dialog als Modless starten sodaß der eigentliche Dialog weiterlaufen kann.



  • dann mach mal und poste das....:D

    btw. kann es sein das die benachrichtigen funktion vom board nicht funzt???

    JOat


Anmelden zum Antworten