IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++/CLI Discussion :

SplashScreen avec Form2


Sujet :

C++/CLI

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Par défaut SplashScreen avec Form2
    Bonjour, malgré toutes mes recherches sur Google je n'arrive toujours pas a créer un Splashscreen pour mon application.
    Dans mon appli j'ai 2 Formulaires Form1 et SPL ,
    Dans Form1 j'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include "SPL.h"
    #pragma endregion
    	private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
    				Form1::Hide();
    		 		SPL^ form = gcnew SPL();
    				form->Show();
    						 }
    Dans Form2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	private: System::Void timer2_Tick(System::Object^  sender, System::EventArgs^  e) {
    	for (double dblOpacity = 1; dblOpacity > 0; dblOpacity += -0.05)
    	{
    	Opacity = dblOpacity;
    	Refresh();
    	System::Threading::Thread::Sleep(50);
    		 }
        this->Close();
    Les 2 Form s'affiche au démarrage mais je voudrai masquer temporairement Form1 pour ne laisser que la Form2 le temps de Timer1 qui est dans Form2.
    J'ai testé plusieurs methodes dont Form1::Hide(); mais impossible de masquer Form1.
    Merci de votre aide

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 487
    Par défaut
    Vous faite une attente active dans votre boucle et vous bloquez le thread graphique avec "System::Threading::Thread::Sleep(50);".

    Utilisez votre timer pour lancer plusieurs fois la mise à jour de votre Splash Screen et c'est au dernier appel que vous appelez "Close".
    Donc pas de "for" mais appels multiples à la méthode timer2_Tick.

    Votre Spash Sceen sent un peu le bricolage.

    http://www.reflectionit.nl/Articles/Splash.aspx

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Par défaut
    Pardon d'être novice mais je crains ne pas comprendre ce que tu me dis, aurais tu un petit exemple qui reprendrait mon mon SplashScreen de l'Espace
    Je sais sais du bricolage mais je ne suis pas encore en mesure d'en créer un vrais car je manque de pratique et de formation car je fais ça à titre perso en loisirs.
    Donc je fais à mon niveau
    Merci d'avance!!

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 487
    Par défaut
    Vous bloquez le thread graphique avec "System::Threading::Thread::Sleep(50);" donc votre affichage de l'application.

    Utilisez l'exemple du lien que je vous ai fourni.
    Il devrait contenir le code source si vous êtes curieux du comment c'est fait.

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Par défaut
    Merci pour le lien, mais il semblerai que la class SplashApplicationContext ne soit pas possible en c++ ou alors j'ai pas su trouver car j'ai implémenté dans toutes les formes possible mais toujours la même erreur:
    C2061: erreur de syntaxe*: identificateur 'SplashApplicationContext'


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SplashApplicationContext^ myContext  = gcnew SplashApplicationContext(gcnew Form1(), gcnew SplashForm(), 2000);
    Dans le lien ils remettent ce code mais avec une intervalle de 0 pour arrêter le timer, là je comprend pas ou enserrer cet arrêt du Timer , à la suite du précèdent dans Form1.h?
    Merci

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 487
    Par défaut
    class SplashApplicationContext ne soit pas possible en c++
    Le C++/CLI permet de faire des choses que les autre langages .NET ne peuvent pas faire. Tout ce que peut faire un langage .NET est faisable en C++/CLI.

    C2061: erreur de syntaxe*: identificateur 'SplashApplicationContext'
    N'oubliez pas les références d'assemblies et les namespaces.
    SplashApplicationContext est dans le namespace "ReflectionIT.Windows.Forms".

    Dans le lien ils remettent ce code mais avec une intervalle de 0 pour arrêter le timer, là je comprend pas ou enserrer cet arrêt du Timer , à la suite du précèdent dans Form1.h?
    Jetez un coup d'oeil au source. Vous verrez que le fait de mettre 0 à la place de 2000, oblige le SplashSreen à se fermer lui-même.
    Essayez de comprendre un peu le code C# et vous pourrez faire la même chose en C++/CLI.
    Si vous ne voulez pas utiliser le code source C# pour en faire une assembly que vous utiliseriez directement, bien sûr.

  7. #7
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Le C++/CLI permet de faire des choses que les autre langages .NET ne peuvent pas faire. Tout ce que peut faire un langage .NET est faisable en C++/CLI.
    Ok au moins là c'est clair!!
    Citation Envoyé par bacelar Voir le message
    N'oubliez pas les références d'assemblies et les namespaces.
    SplashApplicationContext est dans le namespace "ReflectionIT.Windows.Forms".
    Là je patine dans la choucroute !!
    J'ai toujours la même erreur.
    dans Form1.h j'ai mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #pragma once
    # include "SplashForm.h"
    namespace Splachscreen {
     
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    	using namespace System::Reflection;
    Dans SplashForm.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #pragma once
     
    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
    using namespace System::Reflection;

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 487
    Par défaut
    Là je patine dans la choucroute !!
    OK, on va reprendre en première.

    En lisant le code C#, pensez-vous pouvoir le convertir en C++/CLI ?
    Il est très simple et en le convertissant vous n'aurez plus à gérer les problématiques d'utilisation d'assemblies.

  9. #9
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Par défaut
    Citation Envoyé par bacelar Voir le message

    En lisant le code C#, pensez-vous pouvoir le convertir en C++/CLI ?
    En tant que novice pas bien malheureusement.
    Citation Envoyé par bacelar Voir le message
    Il est très simple et en le convertissant vous n'aurez plus à gérer les problématiques d'utilisation d'assemblies.
    En fait je n'est trouvé de convertisseur gratuit de C# to C++/Cli
    Si j'ai bien compris, Class SplashApplicationContext est une dans l'espace de nom ReflectionIT le tout dans un fichier d'entête SplashApplicationContext
    Pourquoi ne pas mettre la class SplashApplicationContext directement dans Form1?
    C'est pour moi un peu tordu tout ça !!

    J'ai débuggé le code source fournit sur le site en C# , ça fonctionne mais je n'est trouvé la différence du changement de la valeur0-->2000.

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 487
    Par défaut
    mais je n'est trouvé la différence du changement de la valeur0-->2000.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public SplashApplicationContext(Form mainForm, Form splashForm, int timeout) : base(splashForm)
    		{
    			myMainForm = mainForm;
    			mySplashForm = splashForm;
    
    			// Initialize the SplashForm
    			splashForm.ShowInTaskbar = false;
    			splashForm.FormBorderStyle = FormBorderStyle.None;
    			splashForm.StartPosition = FormStartPosition.CenterScreen;
    
    			// Initialize the Timer
    			if (timeout > 0) 
    			{
    				myTimer = new Timer();
    				myTimer.Interval = timeout;
    				myTimer.Tick += new EventHandler(TimerEventProcessor);
    				myTimer.Start();
    			}
    		}
    Si 0 pas de timer, si pas de timer, pas d'appel de callback qui ferme le spashscreen.
    Le code C# est extrêmement simple et donc très proche du C++/CLI. Les seules différences sont que le passage des paramètres est toujours "par référence" et que les variables sont toujours des références.
    Il est donc facile de convertir la 20 de lignes de code C# en C++/CLI.
    Vous pouvez aussi vous en servir comme pseudo-code qui donne le procédé plutôt que du code.

    Il n'y a pas de fichier d'en-tête en C#, c'est le compilateur qui génère ces meta-données.

    Pourquoi ne pas mettre la class SplashApplicationContext directement dans Form1?
    SplashApplicationContext trvailm avec n'import quel formulaire, pourquoi la mettre dans Form1 ?

    C'est pour moi un peu tordu tout ça !!
    Avec une meilleur connaissance de la plateforme .NET et Windows, vous verrez que cela n'a rien de tordu.

  11. #11
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Si 0 pas de timer, si pas de timer, pas d'appel de callback qui ferme le spashscreen.
    Ce n'est de ça que je parlais mais c'est bon j'ai compris
    Citation Envoyé par bacelar Voir le message
    Le code C# est extrêmement simple et donc très proche du C++/CLI. Les seules différences sont que le passage des paramètres est toujours "par référence" et que les variables sont toujours des références.
    Je comprends qu'il est difficile pour vous de voir que je manque cruellement de formation mais croyez moi je m'investis assez comme ça.
    Je suis désolé de pas être a votre niveau, je code pour mon plaisir.
    Citation Envoyé par bacelar Voir le message
    Il est donc facile de convertir la 20 de lignes de code C# en C++/CLI.
    Heu là, moi pas tout compris !!! lol
    Citation Envoyé par bacelar Voir le message
    Vous pouvez aussi vous en servir comme pseudo-code qui donne le procédé plutôt que du code.
    Effectivement dans ce cas le plus important pour moi n'est pas le SplashScreen mais plutôt l'implémentation de cette fonction.
    Citation Envoyé par bacelar Voir le message
    Il n'y a pas de fichier d'en-tête en C#, c'est le compilateur qui génère ces meta-données.
    ça au moins c'est fait !!! lol
    Je plaisante!!

    J'ai tout traduit en C++/CLI, je compile sans erreur mais la SplashForm ne s'affiche pas comme si le Timer était a "0" alors qu'il doit être a 2000 par défaut.
    Je vous met le projet en C++ si vous avez 5 min pour y jeter un œil.
    http://www.partage-fichiers.com/dl.p...lashScreen.zip
    Utilisateur : sh7gfafk
    Mot de passe : aen82k9w
    Merci

  12. #12
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 487
    Par défaut
    Désolé de ne pas vous avoir mâché le travail mais je trouve que votre travail de migration est bien plus qu'honorable.

    Il marche presque votre programme.

    Vous avez juste fait une petite faute d'étourderie.

    Dans votre projet, vous avez 2 méthodes Main.

    Une dans Form1.h et une dans SplashScreen.cpp.

    Vous avez mis à jour le Main de Form1.h mais c'est celui de SplashScreen.cpp qui est lancé.

    Fusionnez ces mains. Moi j'utiliserais celui de SplashScreen.cpp car une application, c'est pas son interface.

    Cela donnerait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [STAThreadAttribute]
    int main(array<System::String ^> ^args)
    {
    	// Activation des effets visuels de Windows XP avant la création de tout contrôle
    	Application::EnableVisualStyles();
    	Application::SetCompatibleTextRenderingDefault(false); 
     
    	SplashApplicationContext ^myContext = gcnew SplashApplicationContext(gcnew Form1(), gcnew SplashForm(), 0);
    	Application::Run(myContext);
     
    	return 0;
    }
    Et encore félicitation pour votre persévérance.

  13. #13
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Par défaut
    Merci,

    Citation Envoyé par bacelar Voir le message
    Dans votre projet, vous avez 2 méthodes Main.
    Une dans Form1.h et une dans SplashScreen.cpp.
    Fusionnez ces mains. Moi j'utiliserais celui de SplashScreen.cpp car une application, c'est pas son interface.
    Effectivement
    J'ai suprimé celui de Form1 et conservé celui de SplashScreen.cpp et ça fonctionne
    Merci pour votre aide!!
    Bien que peu indispensable j'ai beaucoup appris avec ce SplashScreen !!
    @++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. SplashScreen avec image splash dans themepack
    Par denamaf dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 11/09/2008, 08h40
  2. SplashScreen avec fondu
    Par lili2008 dans le forum Langage
    Réponses: 3
    Dernier message: 15/07/2008, 18h55
  3. SplashScreen avec progressbar
    Par JAVIR dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 21/09/2007, 22h13
  4. Réponses: 3
    Dernier message: 22/06/2006, 17h39
  5. Réponses: 6
    Dernier message: 05/05/2006, 11h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo