IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Aide avec fenetre windows


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2010
    Messages : 24
    Points : 22
    Points
    22
    Par défaut Aide avec fenetre windows
    Bonjour a tous

    Voila mon probleme je suis entrain de lire le cours sur les fenetres de Jessee edouard j'ai ecrit un bout de code mais sa affiche pas la fenêtre
    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    #include <windows.h>
     
    int WINAPI WinMain ( HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow)
    {
        WNDCLASS Win;
        HWND hWnd;
        Win.cbClsExtra=0;
        Win.cbWndExtra=0;
        Win.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
        Win.hCursor=LoadCursor(NULL, IDI_APPLICATION);
        Win.hIcon=LoadIcon(NULL, IDI_APPLICATION);
        Win.lpszClassName="C1";
        Win.lpszMenuName=NULL;
        Win.style=CS_HREDRAW|CS_VREDRAW;
     
        hWnd=CreateWindow("C1","Mywind",WS_OVERLAPPEDWINDOW,100,200,600,300,NULL,NULL,NULL,NULL);
        ShowWindow(hWnd,nCmdShow);
    }
    Si quelqu'un peut me trouver ou j'ai fais erreur

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2010
    Messages : 87
    Points : 62
    Points
    62
    Par défaut ())))))))
    bonjour


    tu a oublier d'enregistrer la classe de ton fenètre avant d'appeler la fonction "CreateWindow()" voici le code complet voir si tu n'a pas oublier d'autres choses, bonne chance avec les appwins
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    #include <windows.h>
     
    /*  Declare Windows procedure  */
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
     
    /*  Make the class name into a global variable  */
    char szClassName[ ] = "CodeBlocksWindowsApp";
     
    int WINAPI WinMain (HINSTANCE hThisInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR lpszArgument,
                         int nCmdShow)
    {
        HWND hwnd;               /* This is the handle for our window */
        MSG messages;            /* Here messages to the application are saved */
        WNDCLASSEX wincl;        /* Data structure for the windowclass */
     
        /* The Window structure */
        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
        wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
        wincl.cbSize = sizeof (WNDCLASSEX);
     
        /* Use default icon and mouse-pointer */
        wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName = NULL;                 /* No menu */
        wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
        wincl.cbWndExtra = 0;                      /* structure or the window instance */
        /* Use Windows's default colour as the background of the window */
        wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
     
        /* Register the window class, and if it fails quit the program */
        if (!RegisterClassEx (&wincl))
            return 0;
     
        /* The class is registered, let's create the program*/
        hwnd = CreateWindowEx (
               0,                   /* Extended possibilites for variation */
               szClassName,         /* Classname */
               "Code::Blocks Template Windows App",       /* Title Text */
               WS_OVERLAPPEDWINDOW, /* default window */
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               544,                 /* The programs width */
               375,                 /* and height in pixels */
               HWND_DESKTOP,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               hThisInstance,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
               );
     
        /* Make the window visible on the screen */
        ShowWindow (hwnd, nCmdShow);
     
        /* Run the message loop. It will run until GetMessage() returns 0 */
        while (GetMessage (&messages, NULL, 0, 0))
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages);
            /* Send message to WindowProcedure */
            DispatchMessage(&messages);
        }
     
        /* The program return-value is 0 - The value that PostQuitMessage() gave */
        return messages.wParam;
    }
     
     
    /*  This function is called by the Windows function DispatchMessage()  */
     
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)                  /* handle the messages */
        {
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
     
        return 0;
    }

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2010
    Messages : 24
    Points : 22
    Points
    22
    Par défaut encor le meme probleme :/
    voila j'ai ajouter RegisterClass mais la fenetre ne s'affiche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    #include <windows.h>
     
    int WINAPI WinMain ( HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow)
    {
        WNDCLASS Win;
        HWND hWnd;
        Win.cbClsExtra=0;
        Win.cbWndExtra=0;
        Win.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
        Win.hCursor=LoadCursor(NULL, IDI_APPLICATION);
        Win.hIcon=LoadIcon(NULL, IDI_APPLICATION);
        Win.lpszClassName="C1";
        Win.lpszMenuName=NULL;
        Win.style=CS_HREDRAW|CS_VREDRAW;
        RegisterClass(&Win); 
     
    hWnd=CreateWindow("C1","Mywind",WS_OVERLAPPEDWINDOW,100,200,600,300,NULL,NULL,NULL,NULL);
        ShowWindow(hWnd,nCmdShow);
    }

  4. #4
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Il te manque la boucle des messages et la procédure de fenêtre.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2010
    Messages : 24
    Points : 22
    Points
    22
    Par défaut erreur
    bonjour lucien
    ce que tu dit est logique j'avais deja eu ce probleme avec le printf au debut , mais maintenant le code plante a la fin sa affiche pas la fenetre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    #include <windows.h>
     
    int WINAPI WinMain ( HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow)
    {
        MSG msg;
        WNDCLASS Win;
        HWND hWnd;
        Win.cbClsExtra=0;
        Win.cbWndExtra=0;
        Win.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
        Win.hCursor=LoadCursor(NULL, IDI_APPLICATION);
        Win.hIcon=LoadIcon(NULL, IDI_APPLICATION);
        Win.lpszClassName="C1";
        Win.lpszMenuName=NULL;
        Win.style=CS_HREDRAW|CS_VREDRAW;
        RegisterClass(&Win);
        hWnd=CreateWindow("C1","Mywind",WS_OVERLAPPEDWINDOW,100,100,600,300,NULL,NULL,NULL,NULL);
        ShowWindow(hWnd,nCmdShow);
        while (GetMessage (&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        return msg.wParam;
    }

  6. #6
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par tychus
    Voila mon probleme je suis entrain de lire le cours sur les fenetres de Jessee edouard j'ai ecrit un bout de code mais sa affiche pas la fenêtre
    Salut ! Désolé mais le code que tu as posté ne provient pas de mon cours ou alors indique-moi la page où tu l'as trouvé. Le code minimal pour obtenir une fenêtre visible qui ne fait pas planter le programme se trouve ici. Tu y trouveras le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #include <windows.h>
     
    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
     
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
        WNDCLASS wc;
        HWND hWnd;
        MSG msg;
     
        wc.cbClsExtra     = 0;
        wc.cbWndExtra     = 0;
        wc.hbrBackground  = (HBRUSH)(COLOR_WINDOW + 1);
        wc.hCursor        = LoadCursor(NULL, IDC_ARROW);
        wc.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
        wc.hInstance      = hInstance;
        wc.lpfnWndProc    = WndProc;
        wc.lpszClassName  = "Classe 1";
        wc.lpszMenuName   = NULL;
        wc.style          = CS_HREDRAW | CS_VREDRAW;
     
        RegisterClass(&wc);
     
        hWnd = CreateWindow("Classe 1",
                            "Notre première fenêtre",
                            WS_OVERLAPPEDWINDOW,
                            100, 100, 600, 300,
                            NULL,
                            NULL,
                            hInstance,
                            NULL);
     
        ShowWindow(hWnd, nCmdShow);
     
        while (GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
     
        return (int)msg.wParam;
    }
     
    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch(message)
        {
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
     
        default:
            return DefWindowProc(hwnd, message, wParam, lParam);
        }
     
        return 0L;
    }
    Il est semblable à celui qu'a proposé PIC16F877A, dommage que tu ne l'aies même pas regardé ...

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2010
    Messages : 24
    Points : 22
    Points
    22
    Par défaut re
    j'ai pas lu le cours en complet je suis meme pas arriver aux message mais j'ai cru que ce que j'ai mis en haut allait me donner une fenetre c'est tout
    Ps: j'ai vu le code de PIC16F877A et je le connais de deja vu que code blocks le donne mais je veux savoir le probleme dans mon code
    Merci quand meme

  8. #8
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Pour créer une fenêtre, il suffit d'appeler CreateWindow et rien d'autre ! Tu as raison ! Alors pourquoi ton code ne marche-t-il pas ?

    Parce que CreateWindow a besoin qu'on lui passe en paramètre le nom de la classe sur laquelle sera basée la construction de la fenêtre. Il existe des classes prédéfinies par Windows, mais pour une fenêtre principale d'application, il faut généralement définir la sienne. Du coup, pour créer la fenêtre principale d'une application, tu dois d'abord appeler RegisterClass avant d'appeler CreateWindow. Est-ce que cela suffit ?

    Non. RegisterClass a à son tour besoin qu'on spécifie dans la structure (WNDCLASS) qui lui sera passée en paramètre l'adresse de la fonction qui dira ce que la fenêtre doit faire en réponse aux différentes actions de l'utilisateur (entre autres). Cette fonction s'appelle la procédure de fenêtre. Ainsi, il faut aussi écrire une procédure de fenêtre et spécifier son adresse dans la structure WNDCLASS. Est-ce que cela suffit ?

    Toujours pas. Parce qu'il faut que le programme intercepte tous les messages (les actions de l'utilisateur, etc.) à destination de sa ou de ses fenêtres et décide lesquels passer à la procédure de fenêtre et lesquels envoyer ailleurs (poubelle, au système, traitement immédiat, etc.). Cela se fait au moyen de ce qu'on appele la boucle des messages. Et maintenant est-ce que c'est fini ?

    Oui ! Le problème maintenant, c'est le traitement des messages mais la fenêtre elle a bien été créée et est fonctionnelle.

    Mais on peut aussi maintenant se poser la question : pourquoi Microsoft n'a pas créée une ou des classes prédéfinies pour les fenêtres principales d'application ? Pour au moins deux onnes raions :

    1. Tu peux utiliser n'importe quelle classe prédéfinie (Button, Edit, etc.) pour créer ta fenêtre principale ! Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <windows.h>
     
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
        HWND hWnd;
        MSG msg;
     
        hWnd = CreateWindow("BUTTON", "Notre première fenêtre",
            WS_OVERLAPPEDWINDOW | WS_VISIBLE,
            100, 100, 600, 300,
            NULL, NULL, hInstance, NULL
        );
     
        while (GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
     
        return (int)msg.wParam;
    }
    Bien évidemment, l'intérêt est limité et la fermeture de la fenêtre n'entraîne pas la terminaison de l'application car nous n'avons pas écrit une procédure de fenêtre pour faire cela.

    2. Même s'ils avaient créé des classes plus adaptées pour des fenêtres principales d'application (c'est-à-dire autres que Button, Edit, etc.), cela aurait juste permis aux développeurs de ne pas appeler RegisterClass dans leurs applications (mais les aurait par contre obligé à appeler d'autres fonctions à la place ...) car de toute façon il faudra toujours écrire une boucle de messages et une procédure de fenêtre pour obtenir une application fonctionnelle et propre, car les développeurs programment rarement juste dans le but de contempler une fenêtre passive d'une application buggée.

    En conclusion, une classe prédéfinie "fenêtre principale d'application" n'a aucun intérêt . Pour tes développements, tu peux cependant utiliser des bibliothèques comme Win32++ par exemple afin de masquer la complexité de l'API Windows, mais API Win32 vs bibliothèques c'est une autre histoire ...

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2010
    Messages : 87
    Points : 62
    Points
    62
    Par défaut ())))))))
    lire le commentaire écrit pour la fonction "WndProc()"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /*  This function is called by the Windows function DispatchMessage()  */
     LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    il faut utilise la procedure de fenètre celle que tu a appelé par la fonction "DispatchMessage ()"

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Programme C++ avec fenetre Windows
    Par ludo68800 dans le forum Dev-C++
    Réponses: 1
    Dernier message: 12/12/2009, 10h51
  2. Interaction avec fenetre windows
    Par pgerbaux dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 13/09/2009, 13h29
  3. [Problème] Fenetre d'aide avec texte formatté
    Par joker.benj dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 14/05/2006, 19h10
  4. Le dessin avec VC dans une fenetre windows
    Par ccensam dans le forum MFC
    Réponses: 3
    Dernier message: 03/11/2005, 23h40
  5. Besoin d'aide avec postgresql sous windows NT
    Par Chihuahua dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 18/07/2003, 08h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo