Les MessageBox restent en arrière plan et invisibles

Résolu
MGD Software Messages postés 186 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 avril 2022 - 14 nov. 2019 à 14:01
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 - 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.

2 réponses

MGD Software Messages postés 186 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 avril 2022 2
Modifié le 14 nov. 2019 à 15:20
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é.
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
14 nov. 2019 à 17:17
Salut, j'aime bien quand tu réponds toi même à tes interrogations ;)
0
Rejoignez-nous