Perte de focus sur form

Signaler
Messages postés
5
Date d'inscription
lundi 21 mars 2005
Statut
Membre
Dernière intervention
12 janvier 2006
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
Salut,

Je travail actuellement sur un projet de type Winform.

A l'ouverture de celui-ci, une fenêtre avec une barre de progression
apparait et doit ensuite laisser place à la fenêtre principale du
projet.

Toutefois, lorsque celle-ci disparait, la fenêtre principale est
envoyée derrière toutes les autres fenêtre ouvertes sur le bureau.

Comment puis-je éviter cela.

Merci d'avance.

7 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
92
Salut,

La méthode Form.BringToFront héritée de Control devrait pouvoir t'aider il me semble. :-)

/*
coq
MVP Visual C#
*/
Messages postés
5
Date d'inscription
lundi 21 mars 2005
Statut
Membre
Dernière intervention
12 janvier 2006

Merci pour ta réponse,

mais j'ai déjà essayé cette méthode et elle n'a pas d'impact sur ma fenêtre principale.



pour info, ma fenêtre contenant la barre de progression est lancée en
asynchrone par un thread et c'est au moment de l'arret du thread que la
fenêtre principale est basculée en arrière plan.
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
92
Tu peux décrire un peu plus le déroulement stp ?

/*
coq
MVP Visual C#
*/
Messages postés
5
Date d'inscription
lundi 21 mars 2005
Statut
Membre
Dernière intervention
12 janvier 2006

en gros,

mon main lance tout d'abord un thread qui va ouvrir une fenêtre (barre de progression),

ensuite, il lance le constructeur de ma fenêtre principale dans lequel
je met à jour la valeur de la barre de progression et je stope le
thread.
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
92
C'est en fait assez "simple" à résoudre (hormis les implications niveau cross thread que je te laisse résoudre).
Il te suffit en effet d'appeler BringToFront après la fermeture de ton Form de progression, et ce dans le thread en question.

Quand tu as Application.Run(new Form1());, le framework initialise derrière un contexte d'application (cf ApplicationContext).
Une propriété interessante de cette classe est MainForm, qui est dans notre cas l'instance retournée par new Form1()

Donc la solution (à mettre au propre) :
Ajout d'un membre à la classe Form1, pour stocker le contexte :
internal static ApplicationContext _appContext; //ça c'est pas très propre...

De transformer l'initialisation comme ceci :
Form1._appContext = new ApplicationContext(new Form1());
Application.Run(Form1._appContext);

Et d'effectuer cet appel à la fin de ta procédure de thread :
Form1._appContext.MainForm.BringToFront();

/*
coq
MVP Visual C#
*/
Messages postés
5
Date d'inscription
lundi 21 mars 2005
Statut
Membre
Dernière intervention
12 janvier 2006

Désolé, mais cette solution ne semble toujours pas régler le problème.

voici le code simplifier au maximum :

public class Form1 : System.Windows.Forms.Form

{

private System.ComponentModel.Container components = null;

internal static ApplicationContext _myContext;

private static Form2 f;

private static Thread myThread;



private static void test()

{

f = new Form2();

f.ShowDialog();


Form1._myContext.MainForm.BringToFront();

}



public Form1()

{

int i = 0;


// boucle permettant d'augmenter le temps de traitement

// avant ouverture de la fen\xeatre

while (i<500)


{i = i + 1;System.Console.WriteLine(""+i.ToString());}

myThread.Abort();

}



[STAThread]

static void Main()

{


ThreadStart myThreadDelegate = new ThreadStart(test);


Thread myDummyThread = new Thread(myThreadDelegate);

myThread = myDummyThread;

myThread.Start();


Form1._myContext = new ApplicationContext(new Form1());

Application.Run(Form1._myContext);

}

}
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
92
Ca doit être lié à l'utilisation de ShowDialog.

/*
coq
MVP Visual C#
*/