begin process at 2012 05 29 15:37:36
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Linux

 > 

GUI

 > 

Petit problème API Windows


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Petit problème API Windows

vendredi 9 avril 2010 à 23:55:10 | Petit problème API Windows

hichem16

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

Code C/C++ :
#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);
    }
}

samedi 10 avril 2010 à 07:39:47 | Re : Petit problème API Windows

BruNews

Administrateur CodeS-SourceS
classeE n'est pas enregistrée.
Il faut l'enregistrer 1 SEULE FOIS au début du prog.

ciao...
BruNews, MVP VC++
samedi 10 avril 2010 à 10:03:17 | Re : Petit problème API Windows

hichem16

Merci pour la réponse,

quand vous dites n'est pas enregistrée, comment je fais ? ClasseF est utilisée directement dans le main
samedi 10 avril 2010 à 10:14:06 | Re : Petit problème API Windows

uaip

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.
samedi 10 avril 2010 à 10:43:41 | Re : Petit problème API Windows

hichem16

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é:
Code C/C++ :
#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);
    }
}
samedi 10 avril 2010 à 11:41:40 | Re : Petit problème API Windows

uaip

Réponse acceptée !
Pour masquer ta fenêtre enfant dès le départ, il suffit de remplacer ta ligne :
Code C/C++ :
ShowWindow(param, modeDAffichage); //Affiche la fenêtre par défaut

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

Du coup, tu as :
Code C/C++ :
//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.
samedi 10 avril 2010 à 11:44:01 | Re : Petit problème API Windows

uaip

Erf, je me suis mal relu...
C'est plutôt :
Code C/C++ :
        //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.
samedi 10 avril 2010 à 12:23:03 | Re : Petit problème API Windows

hichem16

Merci beaucoup pour votre aide ^^

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


Cette discussion est classée dans : message, wparam, return, classefenetre, fenetreprincipale


Répondre à ce message

Sujets en rapport avec ce message

SysTreeView - au secours [ par Y0ch ] Bonsoir,Je cherche désespérément a comprendre comment initialiser et faire fonctionner un contrôle SysTreeView, mais sans résultat.Peut-être un bête p SendMessage à Dialog [ par vecchio56 ] Salut J'ai un question pour la valeur retournée pas SendMessage quand on l'utilise pour envoyer un message à un Dialog. Voici un exemple: INT_PTR CAL probleme de menu [ par Stubbornman ] Bonsoir a tous,J'ai un soucis avec des menus. Je souhaite creer des fenetres filles qui ont chacune un menu. Or je n'arrive pas a afficher les menus d Pb sur un ptit bout de prog en DirectX.... [ par Haldwin ] Salut a tous....Voila j'ai deux ptits pbs quand je lance cette appli ci-dessous... (VC++)La première est q'une fois sur deux ma variable hWnd apres le Dll Visual Aide [ par TheMaster ] Salut!j'ai un probleme, j'ai créer un logiciel permettant de visualiser des images.Les images sont stocke en ressource dans un dll.Mais je n'arrive pa [Dev C++] disparition hook [ par erehtnaP ] Salut, je commence en C++, et je voudrais creer un hook global avec Dev-C++ Le code de la dll et de l'exe se compile sans erreur, les fonction de mis probleme focus ? [ par sleeper41 ] bonjourvoila j ai 2 threads qui lance 2 dialogbox avec sur l un 1 bouton et sur l autre 1 editbox.mon but est quand j appuie sur le bouton d'ecrire le Problème de linker dans programme de base. [ par vith17 ] Bonjour,J'ai tapé le code suivant sous Dev-C++. Lorsque je lance la compilation, il me revoie l'erreur suivante :    [Linker error] undefined referenc petite question sur les message [ par LordBob ] bonjour a tous,voila mon code est structuré comme ca:BOOL CALLBACK Dialog(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){switch(msg){case WM_INI Annuler Action Menu en Hookant [ par Zootella ] Hello, j'ai cette procédure hook: LRESULT CALLBACK HookMenuMessage(int nCode, WPARAM wParam, LPARAM lParam) { if(nCode == HC_ACTION) {


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,123 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales