acryline
Messages postés33Date d'inscriptiondimanche 14 mai 2006StatutMembreDernière intervention16 décembre 2006
-
22 août 2006 à 19:32
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 2010
-
23 août 2006 à 15:24
Bonjour déjà
Bon voilà mon problème et je seche depuis quelques heures dessus. Ce serait sympa de m'aider .
Je fais un petit programme en API windows . J'ai dessiné une fenêtre, une image de fond, quelques boutons... J'aimerais pouvoir redessiner cette fenêtre quand je presse sur un bouton.
Les notifications des boutons sont testées dans "case WM_COMMAND" par une fonction de mon cru dans laquelle une structure de deux termes( BOOL) est mise à jour et qui est retournée par cette fonction..... ok ? ( En fait leurs valeurs sont inversée. )
J'ai vérifié, sous WM_COMMAND la structure est bien modifiée en passant pas la fonction en question.
Alors j' utilise la fonction InvalidateRect comme ceci pour forcer le message WM_PAINT.
if (temoins.liste) InvalidateRect(hwnd, 0, TRUE);
Passons au code de case WM_PAINT :
case WM_PAINT:
{
HDC hdc =NULL;
PAINTSTRUCT ps;
hdc = BeginPaint(hwnd,&ps);
if(temoins.couv) dessinerCouverture (hwnd,hdc,ps, "Carnet d'adresses",hBouton); // la fonction
if(temoins.liste) exit(0); //pour voir si ça passe ...et non ! :(
EndPaint(hwnd, &ps);
return 0;
}
return 0;
Comme vous l'avez compris, ma fenêtre ne se ferme pas quand temoins.liste =TRUE. Pourquoi ??
J'aimerais bien pouvoir dessiner ma fenêtre avec une autre fonction quand temoins.liste =TRUE.
acryline
Messages postés33Date d'inscriptiondimanche 14 mai 2006StatutMembreDernière intervention16 décembre 2006 23 août 2006 à 06:44
Ok c'est plus clair maintenant.
En résumé :
- je déclare dans mon header les messages :
#define WM_MONMESSAGE WM_APP+1
#define WM_UNAUTREPOURLAROUTE WM_APP+2
Dans ma procédure de fenêtre j'envoie le message :
SendMessage (hwnd, WM_MONMESSAGE, 5," ça marche");
Et dans la procédure de l'autre fenêtre je reçois le message et je peux retrouver wParam et lParam.
case WM_MONMESSAGE :
if (wParam ==5)
{
// code pour afficher le contenu de lParam
}
return 0;
acryline
Messages postés33Date d'inscriptiondimanche 14 mai 2006StatutMembreDernière intervention16 décembre 2006 23 août 2006 à 08:44
Voilà j'ai fait un petit code en C qui ne tient que dans un fichier pour illustré le passage de message perso. Je l'ai dodé dans Code::Blocks et ça marche, je ne garantis rien pour les autres IDE ...
Voici mon code :
#include <windows.h>
// Déclarer le nouveau message
#define WM_MONMESSAGE WM_APP+1
case WM_COMMAND:
if(LOWORD(wParam) ==(LPARAM)ID_BOUTON2)
{
ShowWindow(hwndFille,SW_HIDE);
SendMessage (hwnd,WM_MONMESSAGE,(WPARAM)5,"Le message est passé !!!");
}
return 0;
case WM_PAINT:
UpdateWindow(hwndFille);
return 0;
case WM_CLOSE:
ShowWindow (hwndFille,SW_HIDE);
return 0;
case WM_DESTROY:
ShowWindow (hwndFille,SW_HIDE);
return 0;
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 23 août 2006 à 14:37
C'est pas écrit dans MSDN donc c'est pas obsolète (jusque là ce sont eux qui décident, pas Joseph M. Newcomer. Mais c'est bien précisé qu'on utilise WM_USER que pour les "private window classes", ce qui exclut donc button, listbox et autres contrôles
[auteurdetail.aspx?ID=773591 acryline]> Si ton code marche avec ton compilo, il doit marcher avec tous. Et ca dépend encore moins de l'IDE
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 23 août 2006 à 15:24
On est donc d'accord. C'est aussi cette page sur laquelle je me basais. Elle dit bien qu'on peut utiliser WM_USER mais seulement pour les fenêtres de classe privée
Il n'y a donc aucun risque à utiliser WM_USER si on le fait dans l'usage pour lequel il est prévu