Petit problème API Windows

Résolu
cs_hichem16 Messages postés 12 Date d'inscription dimanche 20 juillet 2008 Statut Membre Dernière intervention 10 avril 2010 - 9 avril 2010 à 23:55
cs_hichem16 Messages postés 12 Date d'inscription dimanche 20 juillet 2008 Statut Membre Dernière intervention 10 avril 2010 - 10 avril 2010 à 12:23
Bonjour à tous ( ou bien bonsoir vu l'heure )

voila , je débute en API Windows et je suis entrain de faire un petit programme bien à moi, je bloque sur la manière de faire apparaitre une fenêtre en cliquant sur un bouton que j'ai créé. voici mon code source, veuillez m'indiquer mon erreur

#include <windows.h>
#define ID_B_CONFIG 0
#define ID_B_QUITTER 1

HINSTANCE cetteInstance;

LRESULT CALLBACK procedureFenetrePrincipale(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK procedureNewWND(HWND, UINT, WPARAM, LPARAM);
int CreateNewWND();

int WinMain (HINSTANCE cetteInstance, HINSTANCE precedenteInstance,
LPSTR lignesDeCommande, int modeDAffichage)
{
    HWND fenetrePrincipale;
    MSG message;
    WNDCLASS classeFenetre;

    classeFenetre.style = 0;
    classeFenetre.lpfnWndProc = procedureFenetrePrincipale;
    classeFenetre.cbClsExtra = 0;
    classeFenetre.cbWndExtra = 0;
    classeFenetre.hInstance = NULL;
    classeFenetre.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    classeFenetre.hCursor = LoadCursor(NULL, IDC_ARROW);
    classeFenetre.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
    classeFenetre.lpszMenuName =  NULL;
    classeFenetre.lpszClassName = "classeF";

    // au cas où ça échoue
    if(!RegisterClass(&classeFenetre)) return FALSE;

    fenetrePrincipale = CreateWindow("classeF", "Gestion Puissance", WS_OVERLAPPEDWINDOW,
                                   CW_USEDEFAULT, CW_USEDEFAULT, 640,480,
                                                   NULL, NULL, cetteInstance, NULL);
    if (!fenetrePrincipale) return FALSE;

    ShowWindow(fenetrePrincipale, modeDAffichage);
    UpdateWindow(fenetrePrincipale);


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

LRESULT CALLBACK procedureFenetrePrincipale(HWND fenetrePrincipale, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HWND boutons[2] = {NULL};
    switch (message)
    {
        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
                case ID_B_CONFIG:
                    CreateNewWND();
                    break;

                case ID_B_QUITTER:
                    SendMessage(fenetrePrincipale, WM_DESTROY, 0, 0);
                    break;
            }
            return 0;

        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;

        case WM_CREATE:
                boutons[0] = (HWND__*)CreateWindow("BUTTON", "Config", WS_CHILD | WS_VISIBLE,550, 5, 70, 30, fenetrePrincipale, ID_B_CONFIG, cetteInstance, NULL);
                boutons[1] = (HWND__*)CreateWindow("BUTTON", "Quitter", WS_CHILD | WS_VISIBLE,550, 40, 70, 30, fenetrePrincipale, (HMENU__*)ID_B_QUITTER, cetteInstance, NULL);
            return 0;

        default:
            return DefWindowProc(fenetrePrincipale, message, wParam, lParam);
    }
}

int CreateNewWND()
{
    HWND NewWND;
    WNDCLASS classeFenetre;
    int modeDAffichage = 0;

    classeFenetre.style = 0;
    classeFenetre.lpfnWndProc = procedureNewWND;
    classeFenetre.cbClsExtra = 0;
    classeFenetre.cbWndExtra = 0;
    classeFenetre.hInstance = NULL;
    classeFenetre.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    classeFenetre.hCursor = LoadCursor(NULL, IDC_ARROW);
    classeFenetre.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
    classeFenetre.lpszMenuName =  NULL;
    classeFenetre.lpszClassName = "classeE";

    NewWND = CreateWindow("classeE", "config", WS_OVERLAPPEDWINDOW,
                                   CW_USEDEFAULT, CW_USEDEFAULT, 320,480,
                                                   NULL, NULL, cetteInstance, NULL);
    if (!NewWND) return FALSE;

    ShowWindow(NewWND, modeDAffichage);
    UpdateWindow(NewWND);
}

LRESULT CALLBACK procedureNewWND(HWND fenetrePrincipale, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;

        default:
            return DefWindowProc(fenetrePrincipale, message, wParam, lParam);
    }
}

7 réponses

uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
10 avril 2010 à 11:41
Pour masquer ta fenêtre enfant dès le départ, il suffit de remplacer ta ligne :
ShowWindow(param, modeDAffichage); //Affiche la fenêtre par défaut

par :
ShowWindow(param, SW_HIDE); //Masque la fenêtre

Du coup, tu as :
//Pour afficher la fenêtre enfant
case ID_B_CONFIG:
        ShowWindow(param, SW_SHOW); //Affiche la fenêtre
        break;
//...
LRESULT CALLBACK procedureNewWND(HWND NewWND, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        //Pour masquer la fenêtre enfant
        case WM_QUIT:
            ShowWindow(NewWND, SW_SHOW); //Masque la fenêtre
            return 0;

        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;

        default:
            return DefWindowProc(NewWND, message, wParam, lParam);
    }
}


Pour jouer avec la visibilité d'une fenêtre, tu peux jeter un oeil ici.

Il faudra quand même prévoir un moyen d'appeler DestroyWindow pour détruire "proprement" la fenêtre enfant en fin de programme. Quoi que la destruction de la fenêtre parent le fait automatiquement.

Cordialement, uaip.
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 avril 2010 à 07:39
classeE n'est pas enregistrée.
Il faut l'enregistrer 1 SEULE FOIS au début du prog.

ciao...
BruNews, MVP VC++
0
cs_hichem16 Messages postés 12 Date d'inscription dimanche 20 juillet 2008 Statut Membre Dernière intervention 10 avril 2010
10 avril 2010 à 10:03
Merci pour la réponse,

quand vous dites n'est pas enregistrée, comment je fais ? ClasseF est utilisée directement dans le main
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
10 avril 2010 à 10:14
Oui et euh, de plus, la variable globale "cetteInstance" utilisée pour créer la fenêtre de classe classeE n'a pas de valeur (même si je suppose que ça n'affecte pas directement ton problème).

Pour répondre à ta question, enregistre classeE juste après l'enregistrement de classeF (que ce soit fait une fois pour toutes) et à la limite laisse dans la fonction CreateNewWND() que le CreateWindow() et ce qui suit. Ou mieux, créés la fenêtre dès le départ et joues sur sa visibilité (show/hide).

Pour enregistrer une classe, ce sont les lignes de code entre "WNDCLASS classeFenetre;" (et les suivantes qui mettent à jour cette structure), jusqu'à "RegisterClass(&classeFenetre)".
C'est cette fonction qui manque pour classeE, comme le dit BruNews.


Cordialement, uaip.
0

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

Posez votre question
cs_hichem16 Messages postés 12 Date d'inscription dimanche 20 juillet 2008 Statut Membre Dernière intervention 10 avril 2010
10 avril 2010 à 10:43
Voilà donc !!
maintenant que la deuxieme fenetre est créée, j'ai 2 autres problèmes:
comment cacher cette fenetre et ne la faire apparaitre que lorsque je clique sur le bouton "CONFIG", et comment faire pour que lorsque je clique sur le bouton quitter le la fenetre "Param" la fenetre principale retse ouverte quand meme ( je crosi que c'est un probleme de parent ou un truc comme ca mais je sais pas comment faire).

merci pour vos réponses, voici mon code modifié:
#include <windows.h>
#define ID_B_CONFIG 0
#define ID_B_QUITTER 1

HINSTANCE cetteInstance;

LRESULT CALLBACK procedureFenetrePrincipale(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK procedureNewWND(HWND, UINT, WPARAM, LPARAM);
int CreateNewWND();

int WinMain (HINSTANCE cetteInstance, HINSTANCE precedenteInstance,
LPSTR lignesDeCommande, int modeDAffichage)
{
    HWND fenetrePrincipale,param;
    MSG message;
    WNDCLASS classeFenetre,classeEnfant;

    classeFenetre.style = 0;
    classeFenetre.lpfnWndProc = procedureFenetrePrincipale;
    classeFenetre.cbClsExtra = 0;
    classeFenetre.cbWndExtra = 0;
    classeFenetre.hInstance = NULL;
    classeFenetre.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    classeFenetre.hCursor = LoadCursor(NULL, IDC_ARROW);
    classeFenetre.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
    classeFenetre.lpszMenuName =  NULL;
    classeFenetre.lpszClassName = "classeF";

    // au cas où ça échoue
    if(!RegisterClass(&classeFenetre)) return FALSE;

    classeEnfant.style = 0;
    classeEnfant.lpfnWndProc = procedureNewWND;
    classeEnfant.cbClsExtra = 0;
    classeEnfant.cbWndExtra = 0;
    classeEnfant.hInstance = NULL;
    classeEnfant.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    classeEnfant.hCursor = LoadCursor(NULL, IDC_ARROW);
    classeEnfant.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
    classeEnfant.lpszMenuName =  NULL;
    classeEnfant.lpszClassName = "classeE";

    if(!RegisterClass(&classeEnfant)) return FALSE;

    fenetrePrincipale = CreateWindow("classeF", "Gestion Puissance", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640,480, NULL, NULL, cetteInstance, NULL);
    if (!fenetrePrincipale) return FALSE;
    ShowWindow(fenetrePrincipale, modeDAffichage);
    UpdateWindow(fenetrePrincipale);

    param = CreateWindow("classeE", "param", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 320,480, fenetrePrincipale, NULL, cetteInstance, NULL);
    if (!param) return FALSE;
    ShowWindow(param, modeDAffichage);
    UpdateWindow(param);


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

LRESULT CALLBACK procedureFenetrePrincipale(HWND fenetrePrincipale, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HWND boutons[2] = {NULL};
    switch (message)
    {
        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
                case ID_B_CONFIG:

                    break;

                case ID_B_QUITTER:
                    SendMessage(fenetrePrincipale, WM_DESTROY, 0, 0);
                    break;
            }
            return 0;

        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;

        case WM_CREATE:
                boutons[0] = (HWND__*)CreateWindow("BUTTON", "Config", WS_CHILD | WS_VISIBLE,550, 5, 70, 30, fenetrePrincipale, ID_B_CONFIG, cetteInstance, NULL);
                boutons[1] = (HWND__*)CreateWindow("BUTTON", "Quitter", WS_CHILD | WS_VISIBLE,550, 40, 70, 30, fenetrePrincipale, (HMENU__*)ID_B_QUITTER, cetteInstance, NULL);
            return 0;

        default:
            return DefWindowProc(fenetrePrincipale, message, wParam, lParam);
    }
}


LRESULT CALLBACK procedureNewWND(HWND NewWND, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;

        default:
            return DefWindowProc(NewWND, message, wParam, lParam);
    }
}
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
10 avril 2010 à 11:44
Erf, je me suis mal relu...
C'est plutôt :
        //Pour masquer la fenêtre enfant
        case WM_QUIT:
            ShowWindow(NewWND, SW_HIDE); //Masque la fenêtre
            return 0;

j'avais mis SW_SHOW au lieu de SW_HIDE...

Cordialement, uaip.
0
cs_hichem16 Messages postés 12 Date d'inscription dimanche 20 juillet 2008 Statut Membre Dernière intervention 10 avril 2010
10 avril 2010 à 12:23
Merci beaucoup pour votre aide ^^

pour le reste j'essayerais de me débrouiller ( c'est le meilleur moyen d'apprendre )
cordialement
0
Rejoignez-nous