Win Api : redessiner une fenêtre

Résolu
acryline Messages postés 33 Date d'inscription dimanche 14 mai 2006 Statut Membre Dernière intervention 16 décembre 2006 - 22 août 2006 à 19:32
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 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.

Merci pour votre réponse.

45 réponses

acryline Messages postés 33 Date d'inscription dimanche 14 mai 2006 Statut Membre Dernière intervention 16 décembre 2006
22 août 2006 à 21:07
Voilà j'ai écrit :  static TEMOINS temoins={TRUE,FALSE};
et maintenant ça marche !!!

Merci mille fois !!!
0
acryline Messages postés 33 Date d'inscription dimanche 14 mai 2006 Statut Membre Dernière intervention 16 décembre 2006
22 août 2006 à 21:08
Ok je le fais dans CREATE plutôt alors...
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
22 août 2006 à 21:09
Tu peux enlever le FALSE, il est implicite

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
acryline Messages postés 33 Date d'inscription dimanche 14 mai 2006 Statut Membre Dernière intervention 16 décembre 2006
22 août 2006 à 21:11
mais je compte ajouter d'autres temoins ...

A quoi ça sert les "réponse acceptée !" ?
0

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

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
22 août 2006 à 21:14
Ca sert a dire que le message a résolu ton problème, pour que les gens qui ont le même problème puisse aller direct à la solution

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
acryline Messages postés 33 Date d'inscription dimanche 14 mai 2006 Statut Membre Dernière intervention 16 décembre 2006
22 août 2006 à 21:19
Ok alors super c'est vrai mon problème est résolu. C'est vraiment très sympa de ta part d'y avoir passé autant de temps.

J'avais une idée sur une sujet :je j'ai rien trouvé de bien clair pour une débutant concernant la création de messages sur internet... peut être que tu sais où je pourrais trouver ça, où alors c'estune idée de tuto ?

Encore un grand merci  vecchio56  !
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
22 août 2006 à 21:21
Qu'est ce que tu entends par "création de messages sur internet"

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
acryline Messages postés 33 Date d'inscription dimanche 14 mai 2006 Statut Membre Dernière intervention 16 décembre 2006
22 août 2006 à 21:25
Nan , je me suis mal exprimée lol
Je voulais dire que je n'ai rien trouvé sur internet sur la création de messages perso style (à ce que j'ai pu comprendre) WM_USER+x

La déclaration : où , comment ?
L'histoire de la place prise par d'autres application et registerMessageWindow etc...
A quoi ça sert, comment les utiliser.

J'ai lu pas mal de choses mais ça reste très flou.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
22 août 2006 à 21:30
Quand j'ai besoin de définir un message perso, je fais juste un #define WM_MESSAGEPERSO (WM_USER + X)
RegisterWindowMessage: jamais utilisé, je connais pas
Tu cherches à faire quoi?

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
acryline Messages postés 33 Date d'inscription dimanche 14 mai 2006 Statut Membre Dernière intervention 16 décembre 2006
22 août 2006 à 21:36
Je voulais envoyer un message d'une fenêtre fille vers la fenêtre parent pour lui dire de se redessiner et ouvrir une autre fenêtre fille après la destruction de cette fenetre fille... une histoire de fenêtres quoi lol

Alors comme je n'arrivais pas à faire passer ni WM-PAINT ni WM_CREATE je voulais créer un nouveau message....j'ai vraiment tout essayé.

A la fin j'ai décidé de n'utiliser qu'une seule fenêtre comme tu l'as vu , d'où le problème qui m'a amenée ici...
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
22 août 2006 à 21:38
Tu envoie WM_USER et c'est bon, non?

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
acryline Messages postés 33 Date d'inscription dimanche 14 mai 2006 Statut Membre Dernière intervention 16 décembre 2006
22 août 2006 à 21:40
Nan c'était pas bon, mais je ne sais pas l'utilser et je devais avoir fait d'autres erreurs comme celle que tu  viens de corriger ... j'apprends !
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
22 août 2006 à 21:55
Juste après les includes tu fais:
#define MONMESSAGE  WM_USER+1

Puis quand tu veux l'envoyer tu fais:
SendMessage(HWND,MONMESSAGE,0,0);

Pour le recevoir dans la WndProc  tu fais:
case MONMESSAGE:
    // traitement du message.....
    return 0;
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
22 août 2006 à 21:57
Personnellement, je préfère utiliser WM_APP au lieu de WM_USER car il parait que certains controles se servent du dernier.
0
acryline Messages postés 33 Date d'inscription dimanche 14 mai 2006 Statut Membre Dernière intervention 16 décembre 2006
22 août 2006 à 22:43
Merci

Mais je n'ai pas vraiment saisi l'utilité de ce message WM_USER ou APP. Je sais que c'est utile pour passer d'un thread à un autre mais comme un thread pour moi c'est une sujet de forum ça ne m'avance pas !

Est ce qu'on peut l'utiliser pour passer d'une fenêtre fille à une fenêtre parent ? Est ce que tu as un exemple simple qui me ferait comprendre son utilité et me rendre accro au messages perso ?

Dernière petite question :  si on veut faire passer une valeur dans ce message est ce qu'on peut utiliser lParam et wParam ?

C'est génial de trouver des personnes qui répondent vite et bien ! J'abuse peut être ??

En tout cas merci encore et encore ...
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
22 août 2006 à 23:00
Bien sûr tu peux envoyer ce message de n'importe quel endroit de ton code. wParam et lParam sont là pour passer des valeurs, des pointeurs ou tout ce que tu veux.
Je vais regarder certaines de mes sources où j'utilise ce genre de messages.
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
22 août 2006 à 23:06
Voici un exemple:
http://www.cppfrance.com/code.aspx?ID=34188

Les messages sont définis dans "notify.h".
Les messages sont envoyés à notre fenêtre, à partir d'une classe de gestion des événements.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
23 août 2006 à 04:40
Je ne saisis pas bien la différence entre WM_USER et WM_APP:
WM_USER through 0x7FFF Integer messages for use by private window classes.
WM_APP through 0xBFFF Messages available for use by applications.

En gros si c'est une classe de fenêtre que tu as créée (avec RegisterClassEx), tu peux lui envoyer WM_USER sans souci. Par contre on ne doit pas l'envoyer à une DialogBox par exemple?
<link href="../../../../../css/ie4.css" type="text/css" rel="stylesheet" /><!-- @ --><link href="../../../../../css/inetsdk.css" type="text/css" rel="stylesheet" /><!-- @ --><style type="text/css"><![CDATA[
PRE.clsCode { font-size:110%; }
PRE.clsSyntax { font-size:100%; }
TD DIV.clsBeta { display:none;}

A:link { color:#0000ff; text-decoration:underline;}
A:visited { color:#0000ff; text-decoration:underline;}
A:hover { color:#3366ff; text-decoration:underline;}
MSHelp\:link {
color:#0000ff;
text-decoration:underline;
cursor:hand;
hoverColor:#3366ff;
filterString: ;}
]]></style><link href="ms-help://Hx/HxRuntime/HxLink.css" type="text/css" rel="stylesheet" />

<xml id="_topicdata" pagetype="winnotify" proj="WinUIHXS" name="WM_USER" pubpath="/WinUI/WindowsUserInterface/Windowing/MessagesandMessageQueues/MessagesandMessageQueuesReference/MessagesandMessageQueuesMessages/WM_USER.htm"><!-- topic data --><root></root></xml>

<xml xmlns=""><mshelp:keyword index="A" term="_win32_WM_USER"></mshelp:keyword><mshelp:keyword index="A" term="_win32_WM_USER_cpp"></mshelp:keyword><mshelp:toctitle title="WM_USER Notification"></mshelp:toctitle><mshelp:rltitle title="WM_USER Notification ()"></mshelp:rltitle><mshelp:keyword index="F" term="WM_USER"></mshelp:keyword><mshelp:keyword index="K" term="WM_USER"></mshelp:keyword><mshelp:attr name="TopicType" value="kbRef"></mshelp:attr><mshelp:attr name="Locale" value="kbEnglish"></mshelp:attr><mshelp:attr name="DevLang" value="C++"></mshelp:attr><mshelp:attr name="Technology" value="WinUI"></mshelp:attr><mshelp:attr name="TechnologyVers" value="kbWinUI"></mshelp:attr><mshelp:attr name="DocSet" value="WCSDK"></mshelp:attr><mshelp:attr name="DocSet" value="LHSDK"></mshelp:attr><mshelp:attr name="DocSet" value="PSDK"></mshelp:attr><mshelp:attr name="TargetOS" value="Windows"></mshelp:attr><mshelp:attr name="TopicType" value="apiref"></mshelp:attr><mshelp:attr name="APIName" value="WM_USER"></mshelp:attr><mshelp:attr name="APIType" value="NA"></mshelp:attr><mshelp:attr name="TopicType" value="winnotify"></mshelp:attr></xml>

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
23 août 2006 à 05:31
Dans une de mes applications, j'avais remarqué des comportements bizarres. J'ai longtemps cherché l'erreur dans le code sans y parvenir. C'est en soupçonant l'utilisation de WM_USER que j'ai réussi à résoudre le problème. J'ai commencé par changer les valeurs de mes messages et là j'ai découvert que tout devient normal. En cherchant à comprendre, j'ai appris que la plage de valeurs de WM_USER à 0x7FFF pourraient être utilisées par des contôles comme les EDIT, LISTBOX, COMBOBOX etc. Ce problème ne se pose pas avec l'utilisation des valeurs WM_APP (0x8000-0x8FFF). Les messages définies dans cette plage ne sont valides que dans l'application. Depuis que j'ai commencé à les utiliser, plus aucun problème.
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
23 août 2006 à 05:52
En googlant, j'ai trouvé une page dans laquelle on précise que WM_USER est obsolète:
http://wwww.developerfusion.com/show/1713/2/
0
Rejoignez-nous