Gestion des évènements avec les MFC - Programmation
Marsh Posté le 30-05-2001 à 11:47:25
ca tombe encore une fois sur moi
la gestion des evenements sous VC++ avec MFC, c'est juste une simplification de la gestion des evenements de l'API Win32 brute.
En gros (on va pas entrer dans des details sordides de chez Bilou), en API Win32 t'as des messages qui sont en fait (si mes souvenirs sont bons) des longs : un code pour le message, et des infos complementaires.
Ca t'amene a du code source contenant un imense switch qui organise l'aiguillage suivant le code de l'event genere par win.
Puis bilou fit la MFC:
et la c'est super, y'a de l'objet => switch = polymorphisme
Normalement c'est ce qu'ils auraient du faire : creer des objets avec des methodes virtuelles pour chaque message que l'utilisateur n'aurait plus qu'a redef. Mais chez MS, ils ont le souci de l'optimisation et comme chaque fonction virtuelle eh ben c'est une entree ds la vtable, ils se sont dit, on va bidouiller => utilisation des macros de table de message qui cree pour toi l'imense switch des debuts.
Dans les grandes lignes ca doit etre ca pour le detail regarde la msdn et meme le code source des MFC (si t'est suffisament maso)
Marsh Posté le 30-05-2001 à 11:53:40
wpk a écrit a écrit : ca tombe encore une fois sur moi la gestion des evenements sous VC++ avec MFC, c'est juste une simplification de la gestion des evenements de l'API Win32 brute. En gros (on va pas entrer dans des details sordides de chez Bilou), en API Win32 t'as des messages qui sont en fait (si mes souvenirs sont bons) des longs : un code pour le message, et des infos complementaires. Ca t'amene a du code source contenant un imense switch qui organise l'aiguillage suivant le code de l'event genere par win. Puis bilou fit la MFC: et la c'est super, y'a de l'objet => switch = polymorphisme Normalement c'est ce qu'ils auraient du faire : creer des objets avec des methodes virtuelles pour chaque message que l'utilisateur n'aurait plus qu'a redef. Mais chez MS, ils ont le souci de l'optimisation et comme chaque fonction virtuelle eh ben c'est une entree ds la vtable, ils se sont dit, on va bidouiller => utilisation des macros de table de message qui cree pour toi l'imense switch des debuts. Dans les grandes lignes ca doit etre ca pour le detail regarde la msdn et meme le code source des MFC (si t'est suffisament maso) |
ça TOMBE pas sur toi, c toi qui vient me répondre parce que t l'âme charitable que je demandais et que tu sais de quoi tu parles...
Sinon, merci pour la petite histoire, c'était très instructif, mais en fait je demandais plutot comment on utilise les évènements ! (déosolé !)
Marsh Posté le 30-05-2001 à 17:43:44
[moa j'ai VC++6.0 en Anglais]
bon c facile,
tu selectionne ton objet et deuxieme bouton -> ClassView
en suite tu definit une variable de controle pour ton objet et une fonction pour une evenement de ton controle
et voila ensuite dans "[lenomduprojet]DLG.CPP" cela creer une fonction ou tu gere l'evenement !
A+ Topaz
Marsh Posté le 30-05-2001 à 17:59:44
topaz a écrit a écrit : [moa j'ai VC++6.0 en Anglais] bon c facile, tu selectionne ton objet et deuxieme bouton -> ClassView en suite tu definit une variable de controle pour ton objet et une fonction pour une evenement de ton controle et voila ensuite dans "[lenomduprojet]DLG.CPP" cela creer une fonction ou tu gere l'evenement ! A+ Topaz |
Merci, mais ça c'est pour des évènements prédéfinis, je sais faire, mais je veux savoir pour créer soit même des évènements...
Marsh Posté le 31-05-2001 à 11:05:43
tu fais un truc dans ce style :
à la fin du Win main, tu as uns boucle :
//tant qu'on a pas le message WM_QUIT
while (GetMessage (&msg, NULL, 0, 0))
{
//traduire les données du message pour qu'elles soient lisible
TranslateMessage (&msg) ;
//envoyer le message à Windows qui le transmettra à WINDOWPROC
DispatchMessage (&msg) ;
}
//on envoie une valeur indiquant la fin du programme au système
return msg.wParam ;
}
// Maintenant, la fonction WndProc qui gére les événements . C comme un Action Listener qui gérerait tout.
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
//suivant le message ....
switch (message)
{
case WM_DESTROY:
//si on ferme la fenêtre
//alors mettre un message "WM_QUIT" dans la file d'attente
PostQuitMessage (0) ;
break ;
case WM_CLOSE:
// Si on ferme la fenetre
// on envoie un message WM_QUIT dans la file d'attente
PostQuitMessage (0) ;
break ;
case WM_COMMAND: // Messages "prédéfinis" par l'utilisateur.
switch (wParam)
{
/* ------> */ case ID_PLAYNIFF: // L'id de bouton, de l'option de menu, etc. ...
playNiff() ;
break ;
case ID_PLAYSCORE:
playScor() ;
break ;
case ID_NIFFPLAY :
niffPlay() ;
break ;
case ID_SCOREPLAY :
scorPlay() ;
break ;
case ID_QUITTER :
PostQuitMessage (0) ;
break ;
default:
return (DefWindowProc (hwnd, message, wParam, lParam)) ;
}
break ;
default:
//tous les messages dont nous ne nons servons pas sont renvoyés au système
return (DefWindowProc (hwnd, message, wParam, lParam)) ;
}
// celui là, c'est juste pour enlever un petit warning.
return (DefWindowProc (hwnd, message, wParam, lParam)) ;
}
// Et vooilàà !
Maintenant c'était peut_être pas ça que t'attendais ?
à plus !
Moi aussi, j'ai une question super intéressante :
http://forum.hardware.fr/sqlforum/ [...] ache=cache
Ps : c'est pas du MFC, ce que je viens de te filer .
[edit]--Message édité par Moustaaki--[/edit]
Marsh Posté le 31-05-2001 à 11:31:09
Moustaaki> c'est la facon brute de fonderie ca sans MFC
or je crois que le gringo lui, c'est plus les MFC son trip
donc pour te mettre sur une piste, dans CWnd y'a ca:
CWnd::WindowProc qui a le meme role que ce que Moustaki t'a indique donc creuse un peu la doc et les samples fournis avec
Marsh Posté le 31-05-2001 à 11:33:02
Fais pas du MFC, c'est pas bien.
non, fais ce que tu veux, j'ai jamais essayer MFC
Marsh Posté le 31-05-2001 à 11:44:18
c'est vrai que c'est pas la joie les mfc, mais une fois qu'on a vendu son ame au bilou, on doit payer jusqu'a la fin de ses pauv jours de programmeur
Marsh Posté le 31-05-2001 à 14:23:02
Moustaaki a écrit a écrit : Fais pas du MFC, c'est pas bien. non, fais ce que tu veux, j'ai jamais essayer MFC |
N'empêche que tu devrais, j'vois pas pourquoi tu dis que c pas bien, c carrément pratique les MFC, par exemple, avec les MFC, pour ton pb de de boite de dialogue pour l'ouverture ou la sauvegarde de fichiers, t'aurais même pas eu besoin de nous !!!
Marsh Posté le 31-05-2001 à 14:24:50
...je suis pas à fond, pro-MFC, mais, pour ceux qui connaissent, avouez que c qd même pratique souvent ! (je n'utilise pas QUE ça non plus !!)
Marsh Posté le 31-05-2001 à 16:32:48
El_gringo a écrit a écrit : ...je suis pas à fond, pro-MFC, mais, pour ceux qui connaissent, avouez que c qd même pratique souvent ! (je n'utilise pas QUE ça non plus !!) |
je disais ça pour rire, c'était certe pas très drôle (pas du tout) mais j'ai jamais utilisé les MFC, ça fait 2 semaines que je fais de la prog sous win avec visual et je ne sais même à quoi ça ressemble, ces MFC...
d'ailleur, j'aimerais bien qu'on me montre des exemples de programmes simples fait avec MFC, pour voir.
Marsh Posté le 31-05-2001 à 16:46:50
bin le pb de programmer en MFC c que tu peux plus faire autres choses...
en restant sur du brut, bin tu peux passer a X-window sans trop de pb, car les fondements sont les memes.
Pour moi c mieu d'apprendre le general (quit a se faire chier), et d'etre adaptable partout !
et pour ça, he bin le Java c top
Marsh Posté le 01-06-2001 à 09:31:14
petoulachi a écrit a écrit : bin le pb de programmer en MFC c que tu peux plus faire autres choses... en restant sur du brut, bin tu peux passer a X-window sans trop de pb, car les fondements sont les memes. Pour moi c mieu d'apprendre le general (quit a se faire chier), et d'etre adaptable partout ! et pour ça, he bin le Java c top |
Mais je connais le Java, Mr Petoulachi
Marsh Posté le 30-05-2001 à 09:17:24
Salut, c juste un topic pour qu'une âme charitable m'explique un peu le principe des évènement en C++.
En Java, g l'habitude de les utiliser, mais en C++, vu que je développe sous Visual C++, g pu développer mon application sans vraiement chercher à les comprendre (c VC++ qui les gèrent !)
S'y vous plait...