Accueil > Forum > > > > Les messages envoyés aux fenêtres dans une API Windows
Les messages envoyés aux fenêtres dans une API Windows
mardi 17 juillet 2007 à 16:12:58 |
Les messages envoyés aux fenêtres dans une API Windows

totoui
|
Bonjour, je poste ici en espérant que ce soit le bon endroit (difficile de rechercher "message de fenêtres")... Je programme une API en C++ sans MFC sous VS PRO 2005, et j'aimerais savoir (si il y en a un) quel est le message (du type WM_xxxx) qui est envoyé à l'appli lorsque l'on glisse la fenêtre hors de l'écran, et surtout quel est le message envoyé lorsque l'on la fait revenir sur l'écran. en effet, le fond de ma fenêtre n'est plus réaffiché, et il ne me semble pas que WM_PAINT change quelque chose. Merci d'avance de votre intérêt. Si vous avez besoin de plus d'infos pour me répondre, n'hésitez pas à demander. Amicalement, TotouiX ;)
|
|
mardi 17 juillet 2007 à 16:34:50 |
Re : Les messages envoyés aux fenêtres dans une API Windows

THEwarrior333
|
Je ne crois pas que ce type de message existe (quelqu'un peut-il
confirmer?). Cependant en connaissant les dimensions de la fenêtre et
celle de l'écran, tu dois pouvoir coder une fonction indiquant si la
fenêtre est située hors écran ou non.
|
|
mardi 17 juillet 2007 à 17:11:04 |
Re : Les messages envoyés aux fenêtres dans une API Windows

totoui
|
Merci TheWarrior pour ta réponse rapide.
Je comprends ta solution, mais j'aimerais comprendre pourquoi je n'arrive pas à reproduire le comportement d'un fenêtre classique (une de l'OS par exemple).
Je m'explique.
J'ai 3 fenêtres (au sens 3 Hwnd). une fenêtre principale qui a deux filles (WS_CHILD). Les filles sont :
1/ un dialog avec des boutons
2/ un encart OpenGl.
Je souhaite afficher une image de fond puis par dessus mes boutons (pas des CBoutton, je n'ai pas de MFC) et à côté un petit truc en OpenGl (pas de GLUT).
J'ai donc ça :
///////////////////////////////////////
// Création de la fenêtre principale //
///////////////////////////////////////
Image_de_fond = LoadBitmapA(Hinstance, "IMAGE_FOND_ECRAN");
Hwnd_Fenetre_Principale=CreateWindow("Style_Fenetre_Principale","Espace",WS_OVERLAPPED | WS_SYSMENU | WS_EX_TRANSPARENT ,0,0,1024,768,NULL,NULL,Hinstance,NULL);
//////////////////////////////////////
// Création de la fenêtre OpenGL //
//////////////////////////////////////
Hwnd_OpenGL=CreateWindowEx( WS_EX_APPWINDOW | WS_EX_WINDOWEDGE,"Style_Fenetre_OpenGL","Titre Fenêtre OpenGL", WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 416, 122, 600, 600, Hwnd_Fenetre_Principale, NULL, Hinstance, NULL);
ShowWindow(Hwnd_OpenGL,SW_SHOW);
//////////////////////////////////////
// Création du dialogue principal //
//////////////////////////////////////
Hwnd_Dialogue_Principal=CreateDialog(Hinstance,MAKEINTRESOURCE(DIALOGUE_PRINCIPAL),Hwnd_Fenetre_Principale,(DLGPROC)Gestionnaire_des_messages_Dialogue_Principal);
ShowWindow(Hwnd_Dialogue_Principal,SW_SHOW);
Initialisation_OpenGL();
UpdateWindow(Hwnd_Fenetre_Principale);
ShowWindow(Hwnd_Fenetre_Principale,CmdShow);
et comme je souhaite obtenir un affichage résistant au passage d'une autre fenêtre et au déplacement de ma fenêtre hors de l'écran, j'ai écrit ma fonction d'affichage entièrement dans la boucle de traitement de messages et non pas dans les gestionnaires de chaque fenêtre. (sinon, je résistais à la sortie d'écran mais pas a passage par devant de la fenêtre..)
Ce qui donne :
while (GetMessageA(&Message,NULL,0,0))
{
TranslateMessage(&Message);
DispatchMessage(&Message);
if ( Message.message == WM_PAINT
|| Message.message == WM_NCMOUSELEAVE
// tout plein de tests sur la valeur Message.message //
|| Message.message == WM_SHOWWINDOW
|| Message.message == 0x216
//|| Message.message == WM_TIMER
)
{
/////////////////////////
// Et SI on peignait à partir d'ici??????
/////////////////////////
Hdc_Dialogue = BeginPaint(Hwnd_Dialogue_Principal, &ps);
DrawStateA(Hdc_Dialogue, NULL, NULL, (long)Image_de_fond, NULL, 0, 0, 0, 0, DST_BITMAP);
DessineOpenGl();
// Et SI on peignait 2 fois le fond?
DrawStateA(Hdc_Dialogue, NULL, NULL, (long)Image_de_fond, NULL, 0, 0, 0, 0, DST_BITMAP);
EndPaint(Hwnd_Dialogue_Principal, &ps);
}
}
et là mon bidule est résistant au passage d'une fenêtre, et à la sortie d'écran SAUF l'image de fond (les boutons et l'OpenGl sont bien réaffichés).
Je m'arrache les cheveux.
Si quelqu'un voit une solution, merci d'avance.
|
|
mardi 17 juillet 2007 à 17:58:42 |
Re : Les messages envoyés aux fenêtres dans une API Windows

THEwarrior333
|
Je comprends bien ton problème, je réfléchis à une solution...
As-tu essayé de réafficher le fond avant les boutons et le rendu OpenGL?
|
|
mercredi 18 juillet 2007 à 10:16:31 |
Re : Les messages envoyés aux fenêtres dans une API Windows

totoui
|
Salut, oui, en fait je ne m'occupe pas de l'affichage des boutons, l'ai l'impression qu'ils sont gérés automatiquement à partir du fichier "ressource.h" dans lequel le dialog est défini. et comme tu peux le voir dans mon code, l'image de fond est affichée plusieurs fois : <code> ///////////////////////// // Et SI on peignait à partir d'ici?????? ///////////////////////// Hdc_Dialogue = BeginPaint(Hwnd_Dialogue_Principal, &ps); DrawStateA(Hdc_Dialogue, NULL, NULL, (long)Image_de_fond, NULL, 0, 0, 0, 0, DST_BITMAP); DessineOpenGl(); // c'est ma fonction qui regroupe les instructions OpenGl! // Et SI on peignait 2 fois le fond? DrawStateA(Hdc_Dialogue, NULL, NULL, (long)Image_de_fond, NULL, 0, 0, 0, 0, DST_BITMAP); EndPaint(Hwnd_Dialogue_Principal, &ps); </code>
J'affiche même l'image de fond 2 fois (une avant et une après l'OpenGl) avec la fonction DrawStateA().
Comme je ne maitrise pas complêtement les DC, je te mets le corps de ma fonction DessineOpenGl(); car j'y fais une opération sur les DC's qui pourrait peut-être chambouler le reste, en fait je ne suis pas sûr: <code> void DessineOpenGl() // !!!! uniquement l'OpenGl !!!!!! // { wglMakeCurrent(Hdc_OpenGL, Hrc); // Pour que tous les ordres opengl s'appliquent à cette fenêtre Efface_Fenetre_OpenGL(); // pas d'opérations sur les DC's Projections_OpenGL(); // pas d'opérations sur les DC's Eclairage_OpenGL(); // pas d'opérations sur les DC's Scene_OpenGL(); // pas d'opérations sur les DC's glFlush(); SwapBuffers(Hdc_OpenGL); }; </code>
à noter que je ne fais pas d'opération inverse à "wglMakeCurrent()" car celle que je connais est "wglDeleteContext(hrc)" et m'obligerait à recréer le Hdc_OpenGl à chaque itération. "wglDeleteContext()" est tout de même appelée lorsque je quitte le programme. J'espère ne pas t'embrouiller avec tout ça, et qu'au contraire, même, ça t'aidera. Amicalement, Thomas.
|
|
mercredi 18 juillet 2007 à 15:22:59 |
Re : Les messages envoyés aux fenêtres dans une API Windows

THEwarrior333
|
En fait ce qui me chiffone, c'est ta manière de traiter les messages windows ( dans le while GetMessage() ).
Je n'avais jamais vu cette manière de procéder du coup je me demande si ca peut marcher.
Je veux dire que tu fais une traduction du message (TranslateMessage)
puis tu le propages à ta procédure de traitement des messages par
DispatchMessage. Sauf qu'il n'y a pas de procédure de traitement des
messages! Du coup je ne suis pas sur que cela soit correct. Tu devrais
créer cette procédure et y mettre un switch( message ). Cette procédure
étant appelée en boucle, tu peut y mettre tes fonctions de
raffraichissement de la fenêtre.
Biensûr il faudrait raffraichir la fenêtre dans le cas uniquement ou il
y a superposition ou clipping de la fenêtre. Car là, c'est loin d'être
optimisé...
|
|
mercredi 18 juillet 2007 à 17:02:56 |
Re : Les messages envoyés aux fenêtres dans une API Windows

totoui
|
Ouais je comprends ton désarroi. au début je procédais comme ça, mais ça ne prenait pas. au final, une solution qui a l'air de marcher c'est un mix entre ce que tu dis et ce que je faisais: 1/ Affichage OpenGl (uniquement l'OpenGl) là ou je l'ai expliqué. (avec les tests sur le message, on le fait si le message est WM_PAINT ou WM_NCMOUSELEAVE ou WM_NCLBUTTONUP ou WM_NCLBUTTONDOWN.) 2/ Affichage du fond dans le WM_PAINT du gestionnaire de messages du Dialogue.
Je pense pouvoir m'en sortir avec ça, merci encore pour ton aide, et à la prochaine! Thomas.
|
|
mercredi 18 juillet 2007 à 17:17:39 |
Re : Les messages envoyés aux fenêtres dans une API Windows

THEwarrior333
|
Si jamais un jour tu (ou quelqu'un d'autre) trouves mieux,
postes la solution ici stp, ca doit intéresser pas mal de gens (dont
moi  ).
A+
|
|
Cette discussion est classée dans : message, messages, api, fenêtres, envoyés
Répondre à ce message
Sujets en rapport avec ce message
les messages en API [ par Adeon ]
salut!En API il intervient toujours cette partie de codes qui suit qui gere les messages fenetres.J'aimerai que qq m'explique ce que font les fonction
api win32 messages en arriere plan [ par Derto ]
Bonjour, j'ai plusieurs problème ^^1/Dans mon application j'ai une boucle pour intercepter les messages de cette facon : while (GetMessage(&message
Message windows et les services [ par slfs ]
Bonjour,Je dois convertir une application windows en un service.J'ai des soucis pour trouver l'équivalent des messages windows (fonction postmessage,.
GetMessage d'un HWND [ par kiki67100 ]
Bonjour tousJ'aimerais recupere les message d'une api dabord je recupere le HWND via HWND API = FindWindow(0,"API"); Puis j'aimerais recuperer les m
LAN Socket et multi thread [ par RV2931 ]
Bonjour, Je suis en train d'essayer de faire un chat en réseau, chaque machine est client/serveur sur un port. Mais on m'a conseillé de faire un threa
files de messages [ par spark01 ]
Bonjours Je voudrai savoir si la taille d'une file de message est fixe ou dynami
API Windows, gestion de WM_COMMAND [ par coucou_le_minou ]
Bonjour, tout d'abord pardonnez moi si mon message ne correspond pas a la rubrique choisie, j'ai eu quelques soucis a cerner la categorie de mon probl
Gérer les messages d'erreur de TClientSocket [ par internetservices ]
Salut,je suis en train de créer un programme en C++ utilisant les sockets. J'ai lu que pour éviter d'avoir le message par défaut de windows "raised ex
prob socket [ par flatou ]
salutj'ai créé une appli serveur, banale : un client se connecte, il envoi un message et le serveur affiche le message.j'ai utilisé cela pour la recep
commandes inconnues sous langage C [ par atupac1 ]
<TABLE class=nb4 id=_ctl0_DGMsg style="BORDER-RIGHT: silver 1px solid; BORDER-TOP: silver 1px solid; BORDER-LEFT: silver 1px solid; WIDTH: 100%; BORDE
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|