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

Windows Forms Discussion :

[C#2.0]Problème focus MainForm avec SplashScreen


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    SLE
    SLE est déconnecté
    Membre émérite Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Par défaut [C#2.0]Problème focus MainForm avec SplashScreen
    Bonjour,


    J'ai un problème de focus quand je lance mon appli, qui fait apparaître au préalable un splashscreen.
    Si d'autres applications sont déjà lancées, le splash s'affiche, puis se ferme et le form principal s'affiche, mais en arrière plan, car c'est une autre appli qui a pris le focus.

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
     
    namespace Splash
    {
        public partial class MainForm : Form
        {
            private static bool EndSplash = false;
     
            public MainForm()
            {
                InitializeComponent();
     
                // Affichage du SplashScreen
                Thread th = new Thread(new ThreadStart(ShowSplash));
                th.Start();
                Thread.Sleep(2000); // Pause de 2 secondes pour voir le splash même si initialisation rapide
                EndSplash = true; // Donne le signal de fin du splash pour sortir de la boucle d'attente dans la procédure ShowSplash
            }
     
            private void ShowSplash()
            {
                Splash sp = new Splash();
                sp.Show();
                while (!EndSplash) Application.DoEvents();
                sp.Dispose();            
            }
        }
    }
    Est-ce dû au fait que j'appelle le splash dans un thread ?
    Comment faire pour que ce soit mon appli qui garde le focus ?


    Merci.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Rajoute this.Activate() à la fin de la méthode ShowSplash, pour redonner le focus à la form.
    Mais je ne vois pas trop pourquoi tu affiches le splash dans un thread, puisque tu ne fais rien dans la form en attendant... Tu pourrais tout simplement afficher le splash de façon modale (ShowDialog), et mettre un timer sur le splash pour qu'il se ferme au bout de 2 secondes

  3. #3
    SLE
    SLE est déconnecté
    Membre émérite Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Par défaut
    J'ai mis le splash dans un thread parce que je dois initialiser des connexions à une DB + toute une série de choses.
    Etant donné que je suis dans un autre thread, je n'ai donc pas accès à this.Activate() dans la fonction showsplash.
    J'ai essayé en mettant this.Activate() dans l'event Shown du form, mais ça ne change rien... L'appli reste toujours en arrière plan.
    Je vais changer complètement la manière de programmer. Je vais faire mes initialisations dans le splash.
    Merci.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Etant donné que je suis dans un autre thread, je n'ai donc pas accès à this.Activate() dans la fonction showsplash
    En fait, si... il y a une petite astuce :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                if (!this.InvokeRequired)
                {
                    this.Activate();
                }
                else
                {
                    this.Invoke(new Action(this.Activate));
                }
    Le delegate Action est défini en 3.5, si tu utilises une version moins récente tu peux le définir comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public delegate void Action();

  5. #5
    SLE
    SLE est déconnecté
    Membre émérite Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Par défaut
    Ca ne fonctionne quand-même pas... Le focus repasse toujours sur une autre appli avant, et le form principal reste en arrière.
    J'ai solutionné mon problème autrement.
    Je ne lance plus le splash dans un autre thread.
    Je lance le splash en modal avec un timer qui s'enclenche après mes initialisations (je fais donc maintenant mes initialisations directement dans le form SplashScreen, et je charge mes paramètres dans une classe statique).
    Merci pour toutes tes infos.

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

Discussions similaires

  1. Problème de mémoire avec BDE
    Par Machuet dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 10h11
  2. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33
  3. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02
  4. [Kylix] problème compilation kylix3 avec redhat 9.0
    Par madininaoursa dans le forum EDI
    Réponses: 1
    Dernier message: 02/07/2003, 16h21
  5. Problèmes de versions avec Xalan, Xerces et Java
    Par honeyz dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 05/06/2003, 10h18

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