Qst messagebox

dambeaufort Messages postés 60 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 17 septembre 2004 - 16 avril 2004 à 14:20
dambeaufort Messages postés 60 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 17 septembre 2004 - 17 avril 2004 à 10:13
bonjour,

voici mon probleme:
J'ai une application mfc constitue de plusieur boite de dialogue s'ouvrant a la suite des autres. J'ai un thread qui lit en memoire partagee si un autre process a recu une erreur.

Le probleme c que quand mon thread detecte l'erreur, je souhaiterais lui faire afficher une messagebox, quel que soit la boite modale ou je me trouve.
Pour l'instant ce messagebox s'affiche mais sous ma fenetre en cours. Comment faire pour qu'elle s'affiche en premier plan et qu'elle y reste,, meme si l'utilsateur clique en dehors de son cadre.

Voila mon thread pour le moment:
UINT Threaddetecerreur( LPVOID param )
{ MESSAGE_ERREUR Erreur;
Sleep(100);
for (;;)
{Sleep (100);
Erreur=receptionmemparterreur();
if (Erreur.CodeErreur_materiel==1) {MessageBox(NULL,"erreur sur l'ouverture du port COM1","Erreur",MB_ICONEXCLAMATION | MB_OK);
RtSetEvent(validfinfin); //fermeture process RTX
ExitProcess(0); //fermeture process windows
}

}
}

je sais que le premier parametre correspond a l'handle de la fenetre mere mais je ne sais pas comment la recupere puisque j'ai plusieurs boite modale cree avec domodal.

Merci

31 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
16 avril 2004 à 14:23
GetFocus() en 1er param de MessageBox().

ciao...
BruNews, Admin CS, MVP Visual C++
0
dambeaufort Messages postés 60 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 17 septembre 2004
16 avril 2004 à 14:34
dsl, mais ca ne marche pas, ma fenetre message box est toujours sous ma premiere fentre.
voila maintenant la structure de ma messagebox, c bien ca?
MessageBox(GetFocus(),"erreur sur l'ouverture du port COM1","Erreur",MB_ICONEXCLAMATION | MB_OK);
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
16 avril 2004 à 14:40
Depend de qui a le focus a ce moment.
Si tu veux MessageBox modal sur une fenetre en particulier, passe le handle en param du thread.

MB_OK est egal ZERO alors
MB_ICONEXCLAMATION | MB_OK
strictement inutile
MB_ICONEXCLAMATION seul sera idem.

ciao...
BruNews, Admin CS, MVP Visual C++
0
dambeaufort Messages postés 60 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 17 septembre 2004
16 avril 2004 à 14:47
et bien en fait c pas sur une fenetre en particulier que je le voudrais mais sur la fenetre (dialog) en cours.
Comment faire pour passer le handle en entree du thread afin que celui ci soit remis a jour tte les 100 ms?
Encore merci, dsl si ca marche pas
0

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

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
16 avril 2004 à 14:57
On met
(LPVOID) hwnd
en 4eme param de CreateThread.
Faut voir dans le sabir MFC ou se trouve le param de thread, la c'est ton affaire.

ciao...
BruNews, Admin CS, MVP Visual C++
0
dambeaufort Messages postés 60 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 17 septembre 2004
16 avril 2004 à 15:00
et bien en fait mon thread n'est aps cree avec createthread mais afxbegin thread:
AfxBeginThread (Threaddetecerreur,NULL);

j'ai essayer de mettre le parametre handle en entree du thread mais getfocus me retourne a ce niveau NULL; dc ca va pas.
n'y a t'il pas une autre solution pour faire que ce messageox soit en premier plan?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
16 avril 2004 à 15:03
Mais enfin si tu passes le hwnd de focus, bien entendu tu n'utilises plus GetFocus() mais le pparam du thread.

MeassageBox((HWND) pparam, ....

ciao...
BruNews, Admin CS, MVP Visual C++
0
dambeaufort Messages postés 60 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 17 septembre 2004
16 avril 2004 à 15:13
ca va pas. resumons, voila ce que j'ai:

**focus est une variable globale mise a jour a l'initialisation de la fentre en cours par getfocus

**L4appel du thread:
AfxBeginThread (Threaddetecerreur,focus);

**Le thread:
UINT Threaddetecerreur( HANDLE focus )
{ MESSAGE_ERREUR Erreur;
Sleep(1000);
for (;;)
{Sleep (1000);
Erreur=receptionmemparterreur();
if (Erreur.CodeErreur_materiel==1) {MessageBox((HWND) focus,"erreur sur l'ouverture du port COM1","Erreur",MB_ICONEXCLAMATION);
RtSetEvent(validfinfin); //fermeture process RTX
ExitProcess(0); //fermeture process windows
}

}
}
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
16 avril 2004 à 15:20
Si focus est une variable globale alors plus besoin de param, tu dois poouvoir t'en servit depuis la func de thread.
A part cela, ce n'est pas un thread auxiliaire qui devrait afficher les massages et encore moins fermer le prog par un appel sauvage de ExitProcess. Le thread devrait envoyer un message d'erreur a la fenetre courante qui se chargerait de l'affichage et fermerait proprement le prog.
Envoi par PostMessage un WM_USER+xxx avant sortie du thread en cas d'erreur.

ciao...
BruNews, Admin CS, MVP Visual C++
0
dambeaufort Messages postés 60 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 17 septembre 2004
16 avril 2004 à 15:25
peut tu me donner un peu plus de precision sur ce dernier point, si ca ne te derange pas:
*pourquoi ne pas se servir de afxbeginthread
*comment marche et comment ffaut t'il faire pour poster des messages a la fenetre.

Encore merci
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
16 avril 2004 à 15:39
afxbeginthread reste par force.

#define ERR_THREAD (WM_USER+1)

dans ton thread, au lieu de MessageBox:
PostMessage(focus, ERR_THREAD, 0, 0);
et sortie du thread (return 0;)

dans fenetre:
tu traites le message ERR_THREAD dans lequel tu affiches erreur et tu fermes le prog proprement(handles etc...).

ciao...
BruNews, Admin CS, MVP Visual C++
0
dambeaufort Messages postés 60 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 17 septembre 2004
16 avril 2004 à 15:46
encore une chose, comment traiter le message dans la fenetre et par quelle fonction?
j'ai deja un pretranslatemessage pour chaque fenetre est ce que ca peut etre bon aussi pourr le message envoye par le thread?

dsl d'etre si nul........
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
16 avril 2004 à 16:00
J'ai abandonne depuis longtemps MFC pour ne plus voir tout ce sabir ni ne plus avoir a retenir une seconde couche API qui masque la vraie.
Fait en vrai win32 serait:
switch(message) {
case ERR_THREAD:
MessageBox(hwnd, ...);
....

enfin, rien que du simple et rapide.

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_grems Messages postés 50 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2004
16 avril 2004 à 19:19
La définition exacte de ce param est : "All applications are suspended until the user responds to the message box."

EnjOy

A+
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
16 avril 2004 à 19:28
grems > va donc tester et reviens confirmer uniquement si c'est bon.

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_grems Messages postés 50 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2004
16 avril 2004 à 19:36
:sad) Hoooo !! :sad)
comment tu casse le moral brunews !

je dis juste ke pour afficher une message box en premier plan (à condition ke son affichage ne pose pa de pb), quelque soit ce kon démarre komme application, ce paramètre fonctionne, c tou !!

Moi je débute et je te rapelle ke sa kestion étai :Pour "l'instant ce messagebox s'affiche mais sous ma fenetre en cours. Comment faire pour qu'elle s'affiche en premier plan et qu'elle y reste,, meme si l'utilsateur clique en dehors de son cadre."

Et j'y réponds parfaitement !!! car ca marche,je m'en sers !

EnjOy kan même !
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
16 avril 2004 à 19:51
Tester dans les memes conditions, allait sans dire.

ciao...
BruNews, Admin CS, MVP Visual C++
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
16 avril 2004 à 19:55
dambeaufort> Pour traiter ton message:

Tu Crée une fonction OnThreadError()

et dans le "bloc" BEGIN_MESSAGE_MAP(...) tu rajoutes la ligne

ON_MESSAGE (ERR_THREAD, OnThreadError)
0
cs_grems Messages postés 50 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2004
16 avril 2004 à 19:57
Un message box reste un message box , non ?

si tu dis cela c'est ke tu as testé, moi pas DANS CES CONDITIONS :) . Maintenant, au vu de ce kil demande je ne vois pa pourkoi ca ne marcherai pa. sinon di le moi, ke je me couche moins bête ce soir stp :big)

A+
EnjOy
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
16 avril 2004 à 20:21
Merci vecchio56.
En voyant tout cela, je regretterais presque MFC.
Non je plaisante.

ciao...
BruNews, Admin CS, MVP Visual C++
0
Rejoignez-nous