Petit problème API Windows [Résolu]

cs_hichem16 12 Messages postés dimanche 20 juillet 2008Date d'inscription 10 avril 2010 Dernière intervention - 9 avril 2010 à 23:55 - Dernière réponse : cs_hichem16 12 Messages postés dimanche 20 juillet 2008Date d'inscription 10 avril 2010 Dernière intervention
- 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);
    }
}
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
uaip 1473 Messages postés mardi 20 février 2007Date d'inscription 7 février 2011 Dernière intervention - 10 avril 2010 à 11:41
3
Merci
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.

Merci uaip 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 84 internautes ce mois-ci

Commenter la réponse de uaip
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 10 avril 2010 à 07:39
0
Merci
classeE n'est pas enregistrée.
Il faut l'enregistrer 1 SEULE FOIS au début du prog.

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

quand vous dites n'est pas enregistrée, comment je fais ? ClasseF est utilisée directement dans le main
Commenter la réponse de cs_hichem16
uaip 1473 Messages postés mardi 20 février 2007Date d'inscription 7 février 2011 Dernière intervention - 10 avril 2010 à 10:14
0
Merci
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.
Commenter la réponse de uaip
cs_hichem16 12 Messages postés dimanche 20 juillet 2008Date d'inscription 10 avril 2010 Dernière intervention - 10 avril 2010 à 10:43
0
Merci
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);
    }
}
Commenter la réponse de cs_hichem16
uaip 1473 Messages postés mardi 20 février 2007Date d'inscription 7 février 2011 Dernière intervention - 10 avril 2010 à 11:44
0
Merci
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.
Commenter la réponse de uaip
cs_hichem16 12 Messages postés dimanche 20 juillet 2008Date d'inscription 10 avril 2010 Dernière intervention - 10 avril 2010 à 12:23
0
Merci
Merci beaucoup pour votre aide ^^

pour le reste j'essayerais de me débrouiller ( c'est le meilleur moyen d'apprendre )
cordialement
Commenter la réponse de cs_hichem16

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.