Perte de focus sur form

InfoSep Messages postés 5 Date d'inscription lundi 21 mars 2005 Statut Membre Dernière intervention 12 janvier 2006 - 22 nov. 2005 à 08:30
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 22 nov. 2005 à 15:56
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

cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
22 nov. 2005 à 09:19
Salut,

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

/*
coq
MVP Visual C#
*/
0
InfoSep Messages postés 5 Date d'inscription lundi 21 mars 2005 Statut Membre Dernière intervention 12 janvier 2006
22 nov. 2005 à 10:12
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.
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
22 nov. 2005 à 10:27
Tu peux décrire un peu plus le déroulement stp ?

/*
coq
MVP Visual C#
*/
0
InfoSep Messages postés 5 Date d'inscription lundi 21 mars 2005 Statut Membre Dernière intervention 12 janvier 2006
22 nov. 2005 à 10:49
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
22 nov. 2005 à 12:11
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#
*/
0
InfoSep Messages postés 5 Date d'inscription lundi 21 mars 2005 Statut Membre Dernière intervention 12 janvier 2006
22 nov. 2005 à 15:21
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);

}

}
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
22 nov. 2005 à 15:56
Ca doit être lié à l'utilisation de ShowDialog.

/*
coq
MVP Visual C#
*/
0
Rejoignez-nous