Les MessageBox restent en arrière plan et invisibles [Résolu]

Messages postés
171
Date d'inscription
vendredi 1 septembre 2006
Statut
Membre
Dernière intervention
14 novembre 2019
- - Dernière réponse : Whismeril
Messages postés
14042
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 décembre 2019
- 14 nov. 2019 à 17:17
Bonjour,

Je suis confronté à un phénomène bizarre dont je ne trouve pas l'explication ni la solution.

J'ai une fenêtre MDI dans laquelle je place une fenêtre fille.
Dans cette fenêtre fille, il y a un PictureBox qui sert à dessiner un schéma.
J'utilise le gestionnaire d'évènement de OnPaint (picShema_Paint(sender obj, PaintEventArgs e)) pour dessiner le schéma.

Si, à partir de l'application, j'appelle la fonction MessageBox.Show(), la boite de dialogue se crée bien mais ne s'affiche pas. L'application est bloquée. Si on clique quelque part dans l'appli, on a un "ding".
Par contre, si on appuie sur Entrée ou sur Echap, l'appli est débloquée et le résultat de la MessageBox est pris en compte. Cela prouve qu'elle est bien quelque part en arrière plan et qu'elle a le focus.

Dès que je referme la fenêtre fille, les MessageBox fonctionnent normalement.

A force de chercher, j'ai fini par inhiber le gestionnaire d'évènement de OnPaint du PictureBox en plaçant un simple return au début de la procédure.
Du coup, le schéma ne s'affiche évidemment pas, mais les MessagesBox refonctionnent, preuve que le problème vient bien du gestionnaire d'évènement.
Pourtant il ne semble pas y avoir d'erreur dans ce dernier, le schéma s'affiche sans erreur lorsque le gestionnaire est validé.

D'autre part, en plaçant un point d'arrêt dans le gestionnaire, j'ai pu constater qu'il est appelé en permanence, alors qu'il ne se passe rien dans l'application (la souris ne la survole même pas) et même lorsque l'appli est en arrière-plan. J'ai placé des points d'arrêt sur les différents appels à Refresh du PictureBox, mais ils ne sont pas appelés. En faisant du pas à pas dans le gestionnaire, on repasse jamais au début de la procédure, preuve que ce n'est pas une instruction de celle-ci qui redéclenche le OnPaint. De plus, si c'était le cas, on aurait assez vite un OutOfMemory en raison de la réentrance permanente.

Dans la pile des appels, on ne trouve que l'appel au chargement de la feuille, puis uniquement des lignes internes à Windows (grisées) puis l'entrée dans le gestionnaire. Aucune ligne du programme.

Quelqu'un aurait-il une idée d'où cela peut provenir ?
L'appel permanent pourrait être la cause du non-affichage des MessageBox. Est-ce que cet appel permanent est normal ? (c'est la première fois que je remplis un contrôle "à la main")
Merci.
Afficher la suite 

2 réponses

Messages postés
171
Date d'inscription
vendredi 1 septembre 2006
Statut
Membre
Dernière intervention
14 novembre 2019
0
Merci
J'ai trouvé !
En inhibant une à une les lignes du gestionnaire, j'ai fini par ne plus avoir l'appel permanent.
En fait, après avoir calculé toutes les cotes et avant de tracer, je tentais d'effacer l'image précédente en faisant
PicSchema.image = null;


Je ne me doutais pas qu'en faisant cela (que j'avais trouvé dans un forum), je déclenchais l'évènement OnPaint ! (j'aurais pu, et même dû).

Du coup, je ne sais pas comment effacer le schéma avant de le redessiner. Mais il semblerait qu'au départ de OnPaint, le fond du PictureBox soit vierge. En effet, sans effacement et sur redimensionnement, on ne trouve jamais de trace du schéma précédent.

Donc tout va bien. Mon expérience en dessin s'améliore...
Oubliez ce post trop vite envoyé.
Commenter la réponse de MGD Software
Messages postés
14042
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 décembre 2019
324
0
Merci
Salut, j'aime bien quand tu réponds toi même à tes interrogations ;)
Commenter la réponse de Whismeril