Qst messagebox

Signaler
Messages postés
60
Date d'inscription
mardi 10 février 2004
Statut
Membre
Dernière intervention
17 septembre 2004
-
Messages postés
60
Date d'inscription
mardi 10 février 2004
Statut
Membre
Dernière intervention
17 septembre 2004
-
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

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
GetFocus() en 1er param de MessageBox().

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
60
Date d'inscription
mardi 10 février 2004
Statut
Membre
Dernière intervention
17 septembre 2004

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);
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
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++
Messages postés
60
Date d'inscription
mardi 10 février 2004
Statut
Membre
Dernière intervention
17 septembre 2004

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
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
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++
Messages postés
60
Date d'inscription
mardi 10 février 2004
Statut
Membre
Dernière intervention
17 septembre 2004

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?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
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++
Messages postés
60
Date d'inscription
mardi 10 février 2004
Statut
Membre
Dernière intervention
17 septembre 2004

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
}

}
}
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
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++
Messages postés
60
Date d'inscription
mardi 10 février 2004
Statut
Membre
Dernière intervention
17 septembre 2004

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
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
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++
Messages postés
60
Date d'inscription
mardi 10 février 2004
Statut
Membre
Dernière intervention
17 septembre 2004

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........
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
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++
Messages postés
50
Date d'inscription
mercredi 7 avril 2004
Statut
Membre
Dernière intervention
20 avril 2004

La définition exacte de ce param est : "All applications are suspended until the user responds to the message box."

EnjOy

A+
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
grems > va donc tester et reviens confirmer uniquement si c'est bon.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
50
Date d'inscription
mercredi 7 avril 2004
Statut
Membre
Dernière intervention
20 avril 2004

: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 !
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
Tester dans les memes conditions, allait sans dire.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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)
Messages postés
50
Date d'inscription
mercredi 7 avril 2004
Statut
Membre
Dernière intervention
20 avril 2004

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
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
Merci vecchio56.
En voyant tout cela, je regretterais presque MFC.
Non je plaisante.

ciao...
BruNews, Admin CS, MVP Visual C++