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
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;
 
 
0
acryline Messages postés 33 Date d'inscription dimanche 14 mai 2006 Statut Membre Dernière intervention 16 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

//Boutons
#define ID_BOUTON1      110
#define ID_BOUTON2      111

//Procédures
LRESULT CALLBACK  Fille(HWND , UINT , WPARAM, LPARAM );
LRESULT CALLBACK  Procedure(HWND , UINT , WPARAM, LPARAM );
void ecrireTexte (HDC,int, int, char*,char*, long, long ,long,long,long,BYTE,BYTE,
                  BYTE,BYTE,COLORREF);

//Variable globales
HINSTANCE hinst;
HWND hwnd;

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
    //Variables de la fonction principale

    MSG msg;
    WNDCLASS wc;

    hinst = hinstance;
    // Structure de la classe de la fenêtre principale
    wc.style = 0 ;
    wc.lpfnWndProc = Procedure;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hinst;
    wc.hIcon = NULL;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground =  (HBRUSH)(1+ COLOR_BTNFACE);
    wc.lpszMenuName =  NULL;
    wc.lpszClassName = "Class";

    //Enregistrer la classe de fenêtre
    if(!RegisterClass(&wc)) return FALSE;

    hwnd = CreateWindow("Class", "Petit test message : Fenêtre parent",WS_OVERLAPPEDWINDOW   ,
                              200,50, 360, 505,NULL, NULL, hinstance, NULL);
    if (!hwnd)  return FALSE;

    ShowWindow(hwnd,SW_SHOW);
    UpdateWindow( hwnd );

    //Boucle de message
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

LRESULT CALLBACK  Procedure(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{

    static HWND hwndFille=NULL, hBouton=NULL;
    static HDC hdc;
    WNDCLASS wc;
    switch (uMsg)
    {
        case WM_CREATE:

                //bouton de la fenêtre parent
                hBouton = CreateWindow ("BUTTON", "Fenêtre Fille", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON ,
                           40,20,100,30,hwnd,(HMENU)ID_BOUTON1,hinst,NULL);

                 //Créer la fenêtre fille

                wc.style = 0 ;
                wc.lpfnWndProc = Fille;
                wc.cbClsExtra = 0;
                wc.cbWndExtra = 0;
                wc.hInstance = hinst;
                wc.hIcon = NULL;
                wc.hCursor = LoadCursor(NULL, IDC_ARROW);
                wc.hbrBackground =  (HBRUSH)(1+ COLOR_BTNFACE);
                wc.lpszMenuName =  NULL;
                wc.lpszClassName = "ClasseFille";

                //Enregistrer la classe de fenêtre
                if(!RegisterClass(&wc)) return FALSE;

                hwndFille = CreateWindow("ClasseFille",
                            " Petit test messages : Fenêtre Fille",WS_OVERLAPPEDWINDOW,
                             300,200, 300, 105,hwnd, NULL, hinst, NULL);
                return 0;

        case WM_COMMAND:
           if(LOWORD(wParam) ==(LPARAM)ID_BOUTON1)
           {
           ShowWindow (hwndFille,SW_SHOW);
           }
            return 0;

        case WM_MONMESSAGE:
            if (wParam==(WPARAM)5)
            {
             hdc=GetDC(hwnd);
             ecrireTexte (hdc,20, 200, (char*)lParam,"Comic Sans MS", 22, 12,2,NULL,900,FALSE, FALSE,
                  FALSE,FALSE,RGB(255,0,0));

            ReleaseDC(hwnd,hdc);
            }
            return 0;

        case WM_CLOSE:
             DestroyWindow(hwnd);
            return 0;

        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;

        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
     }

}

LRESULT CALLBACK Fille(HWND hwndFille, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HWND hBoutonFille=NULL;

    switch (uMsg)
    {
        case WM_CREATE:
            //boutonFille
        hBoutonFille = CreateWindow ("BUTTON", "Envoyer WM_MONMESSAGE ", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON ,
                        40,20,200,30,hwndFille,(HMENU)ID_BOUTON2,hinst,NULL);
            return 0;

        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;

        default:
            return DefWindowProc(hwndFille, uMsg, wParam, lParam);
     }

}

// Ecrire du texte
void ecrireTexte (HDC hdc,int x, int y, char phrase [],char police[], long hauteur, long largeur,
                  long espace, long orientation,long epaisseur,BYTE italique, BYTE souligne,
                  BYTE barre,BYTE famillePolice,COLORREF couleurTexte)
{
    HFONT NewFont, OldFont;
    LOGFONT lf;
        lf.lfHeight = hauteur;
        lf.lfWidth = largeur;
        lf.lfEscapement= espace;
        lf.lfOrientation=orientation;
        lf.lfWeight=epaisseur;
        lf.lfItalic =italique;
        lf.lfUnderline=souligne;
        lf.lfStrikeOut =barre;
        lf.lfPitchAndFamily;
        lstrcpy(lf.lfFaceName,police);

     SetBkMode(hdc, TRANSPARENT);

     NewFont = CreateFontIndirect(&lf);
     OldFont = (HFONT)SelectObject(hdc,NewFont);

     SetTextColor(hdc, couleurTexte);
     TextOut(hdc, x, y, phrase, lstrlen(phrase));

     SelectObject(hdc,OldFont);
     DeleteObject(NewFont);
}
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 à 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

_____________________________________
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 à 15:18
Bonjour,
vecchio56 >> Moi je me suis basé sur ma propre expérience. D'ailleurs, je ne fais totalement confiance ni à MSDN ni à qui que ce soit. Dès que j'ai un problème dans le code, je soupçonne tout. Les propos de M. Joseph sont également tirés d'expériences vécues. Pour valider ces propos, je viens de trouver la page MSDN qui parle justement de conflits possibles avec les messages de certains controles:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/messagesandmessagequeues/messagesandmessagequeuesreference/messagesandmessagequeuesmessages/wm_app.asp
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
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

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
Rejoignez-nous