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

Windows Discussion :

Affichage de plusieurs fenêtre


Sujet :

Windows

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 19
    Points : 8
    Points
    8
    Par défaut Affichage de plusieurs fenêtre
    Bonjour!
    Cela fais bien 3 jours que je cherche sur google la solution à mon problème... Je tente de programmer un peu en Winapi, sous dev-cpp! J'ai donc suivi tous les tutoriaux, cours, et j'en passe que j'ai trouvé sur ce site, mais aussi sur tous les autres (enfin ceux que j'ai trouvé). Je me débrouille en général toujours pour réussir à résoudre mes problemes, mais je n'arrive toujours pas à afficher correctement 2 fenêtre!
    Imaginer, vous commencez normal, comme tous les codes winapi de base, vous avez donc votre première fenêtre qui s'affiche... D'accord! Mais comment en afficher une deuxième, qui soit du même style, sans des lignes de codes dans tous les sens... Est-ce que c'est avec CreateWindowsEx, une deuxième fois? Mais alors est-ce que je dois recréer une Class de Fenêtre(WindowClass)... Je serais monstre reconnaissant, si quelqu'un acceptait de m'aider, ou alors de me rediriger sur un site, ou cela est expliquer...
    Merci d'avance!
    Papy.rabbit:08

  2. #2
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par papy.rabbit.08
    ... D'accord! Mais comment en afficher une deuxième, qui soit du même style, sans des lignes de codes dans tous les sens...
    Eh oui mais afficher une deuxième comment ?
    C'est une dialogue ?
    Sinon il faut considérer un environnement MDI..

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Non Non justement! ce n'est pas une boite de dialogue! C'est une fenêtre normal... Enfin je ne sais pas comment est-ce que je peux être plus technique expliquer ce qu'est une fenêtre normal ^^ mais une fenetre créé avec par exemple createwindow ou createwindowex... Je met mon code de base ici, auquel j'aimerais simplement ajouter une fenêtre, par emple par l'intérmédiaire d'un bouton... Enfin je ne sais pas... Et mon problème est de savoir si il faut déclarer une nouvelle classe de fenêtre, comment masquer l'ancienne, comment afficher la nouvelle, enfin j'espère que ceux qui lirons comprendrons...

    Enfait, mon code, s'appelle main.c, tout simplement, et je l'ai placé en pièce jointe! (ou fichier attaché)... Merci d'avance, pour vos réponses!
    Papy.rabbit.08

    Edit:
    Je viens de modifier le fichier main.c, pour rendre la vie plus facile à ceux qui voudraient bien m'aider...
    J'ai mis un bouton "valider" en plein au milieu... Si quelqu'un arrive à faire qu'en pressant ce bouton valider, une nouvelle fenetre "autonome" s'ouvre, je lui en serait reconnaissant! (plus quelques indications svp aussi ca serait bien venu ^^) En tout cas, encore merci! Si quelqu'un arriverait à me faire cela, une parties de mes problemes seraient réglé, je crois...
    Papy.rabbit.08
    Fichiers attachés Fichiers attachés
    • Type de fichier : c main.c (2,2 Ko, 68 affichages)

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Personne ne peut m'aider ?

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Bonjour.

    Il est tout à fait possible de crééer deux fenêtres de la même classe ou même deux fenêtres de classes différentes utilisant la même WindowProc, si tu fais attention aux variables partagées (attention par exemple, les données static se retrouveraient partagées entre toutes les fenêtres utilisant cette WindowProc).
    Ce qui n'est pas possible directement (il y a des moyens détournés), c'est créer deux fenêtre de même classe avec deux WindowProc différentes.

    Ici, tu sembles n'avoir aucune donnée static dans ta WindowProc, donc tu peux tout-à-fait créer deux fenêtres de la même classe.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Merci bcp pour l'intéret que tu as pour mon problème!
    Est-ce que tu crois que tu (ou qqun) ou trouverais le temps d'essayer ce que j'ai dis, avec le bouton valider, qui ouvrirais une nouvelle fenêtre, car cela aurait été bien d'avoir un exemple concret...
    En tout cas merci, je vais me repencher sur la question, et essayer de comprendre par moi même en attendant que peut-être quelqu'un m'éclairsisse!
    Merci beaucoup!
    papy.rabbit.08

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Grace aux informations de Médinoc, j'ai réussi ce que je voulais faire, c'est d'ouvrir deux fenêtre.
    Mais il me reste toujours ce même problème, car j'avais bien pensé qu'en faisant cela comme ça, j'y arriverais... Néanmoins, je ne suis pas sur d'y être arrivé... Le problème, c'est que 2 fenêtre s'ouvre, mais on dirait 2 programmes différents! Dans la barre des tâches, on voit comme s'il y avais 2 programmes ouverts... Les fenêtres sont totalement indépendantes les une des autres, alors ce que je pensais, c'était que lorsque l'on ouvre la deuxième, on ne puisse pas retourner à la première fenêtre, sans avoir fermé la deuxième... Je sais pas si vous suivez, enfin c'est comme une fenêtre d'option dans n'importe quel programme! On a le programme principal, et puis lorsque l'on ouvre une autre fenêtre (par exemple d'option) on ne puisse qu'accèder à celle-là... Et si on ferme, toute l'application n'est pas fermée! Enfin désolé de ces explications confuses, je suis débutant, surtout en termes techniques...
    Voici mon code, si quelqu'un espère encore m'aider :O
    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
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    #include <windows.h>
    #define ID_BOUTON 101
    
    HWND hwnd2;
    
    LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
    int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
        HWND hwnd, bouton;
        MSG msg;
        WNDCLASSEX wc;
    
        wc.hInstance = hinstance;
        wc.lpszClassName = "FenetrePrincipale";
        wc.lpfnWndProc = MainWndProc;      
        wc.style = CS_DBLCLKS;                 
        wc.cbSize = sizeof (WNDCLASSEX);
        wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wc.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        wc.hCursor = LoadCursor (NULL, IDC_ARROW);
        wc.lpszMenuName = NULL;                 
        wc.cbClsExtra = 0;                      
        wc.cbWndExtra = 0;                      
        wc.hbrBackground = CreateSolidBrush(RGB(212,208,200));
    
        if(!RegisterClassEx(&wc)) return 0;
    
        hwnd = CreateWindowEx (
         0,                   
         "FenetrePrincipale",         
         "Login",       
         WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX, 
         200,       
         200,       
         544,                 
         375,                 
         NULL,        
         NULL,                
         hinstance,       
         NULL
    );
    
     hwnd2 = CreateWindowEx (
         0,                   
         "FenetrePrincipale",         
         "Fenetre",       
         WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX, 
         220,       
         220,       
         544,                 
         375,                 
         NULL,        
         NULL,                
         hinstance,       
         NULL                 
    );
    
        bouton = CreateWindowEx(0,
                     "BUTTON",
                         "valider", 
          WS_VISIBLE|WS_CHILD, 
                           30,
                           50,
                          100, 
                           30, 
                      hwnd, 
             (HMENU)ID_BOUTON, 
                    hinstance, 
                         NULL);
                         
        if (!hwnd) return FALSE;
    
        ShowWindow(hwnd, nCmdShow);
        UpdateWindow(hwnd);
    
    
        while (GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        return msg.wParam;
    }
    /******************************************************************************/
    
    LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        switch (uMsg)
        {
            case WM_CREATE:
    
                return 0;
            case WM_COMMAND:
                // Vérifie que c'est bien le bouton    Vérifie si on à cliquer sur le bouton
      if ((LOWORD(wParam) == ID_BOUTON) && (HIWORD(wParam) == BN_CLICKED))
      {     
         ShowWindow(hwnd2, SW_SHOWNORMAL);
         UpdateWindow(hwnd2);
      }
    break; 
                  
                return 0;
                
            case WM_DESTROY: 
                
                PostQuitMessage(0);            
                return 0;
    
            default:
                return DefWindowProc(hwnd, uMsg, wParam, lParam);
        }
    }
    Merci d'avance!
    Papy.rabbit.08

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Hum...
    Pour cela, on utilise généralement une boîte de dialogue, dite boîte de dialogue "Modale". L'API de gestion des boîtes de dialogue se charge de désactiver la fenêtre parent, et de ramener automatiquement le focus sur la boîte quand on clique sur la fenêtre parent...

    Mais il faut savoir qu'une boîte de dialogue ne se crée pas exactement comme une fenêtre. La fonction de création de boîte prend en paramètre une structure DLGTEMPLATE (souvent définie en ressources) qui contient des informations sur la boite de dialogues et sur les contrôles qu'elle doit contenir. L'API crée automatiquement les contrôles dans la boîte de dialogue et appelle la DialogProc() (différente d'une WindowProc()) pour la gestion des messages.

    On définit rarement le DLGTEMPLATE soi-même: Souvent, on le crée en ressources: Soit avec l'éditeur de boîtes de dialogue (absent de VS Express), soit en écrivant dans le "script de ressources" (fichier .rc) et on passe l'ID de ressource à la fonction de création.

    Fonction de création de boîte de dialogue modale: DialogBoxParam(ressource) et DialogBoxIndirectParam(DLGTEMPLATE).
    Fonction de création de boîte de dialogue non-modale: CreateDialogParam(), CreateDialogIndirectParam().


    À présent, si tu n'as pas l'éditeur de ressources, tu peux surement trouver sur le net des "scripts de ressources" de tutoriels qui de montreront comment c'est fait. Ou bien, tu peux tenter de travailler avec les DLGTEMPLATE en mémoire (pour ça, n'hésite pas à regarder dans la partie contributions du forum C/C++, j'ai justement pondu un truc dessus récemment. Mais c'est surtout orienté C++).

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Merci beaucoup! Je vais y réfléchir!

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Et est-ce que quelqu'un aurait un exemple de code, simple à compiler, ou je pourrait retrouver ce principe de deux fenêtre, car j'ai essayé selon ce principe, mais vu mes connaissances techniques, j'ai eu passablement de peine à faire quelque chose...
    Et je suis sur que s'il y avait un bon exemple sur ce sujet, cela pourrait aider passablement de monde ou de débutants, qui apprenent en regardant différents codes, et qui s'aident de questions posés sur des forums...
    En tout cas merci bien!
    Papy.rabbit.08

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Eh bien, je ne sais pas si tu peux vraiment faire deux fenêtres dont une qui paralyse l'autre sans boîte de dialogue. Mais tu peux toujours:
    • Faire une fenêtre sans bouton dans la barre des tâches et qui reste toujours au-dessus de l'autre. Il te suffit de créer la seconde fenêtre avec le style WS_POPUP et le paramètre hWndParent non-nul (ce doit être le HWND de la première fenêtre).
    • Désactiver la fenêtre mère (avec la fonction EnableWindow(), en lui passant FALSE) lorsque tu crées la seconde et la réactiver lors de la fermeture...

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Ben voilà quelques chose de super clair!! :O Merci beaucoup!
    Alors pendant que j'y suis, une dernière question:
    Est-ce que je dois créer une procédure de fenêtre pour chaque fenêtre que je créer, et est-ce que je dois créer une classe pour chaque fenêtre également?
    En tout cas, merci!
    Papy.rabbit.08

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Citation Envoyé par Médinoc
    Bonjour.

    Il est tout à fait possible de crééer deux fenêtres de la même classe ou même deux fenêtres de classes différentes utilisant la même WindowProc, si tu fais attention aux variables partagées (attention par exemple, les données static se retrouveraient partagées entre toutes les fenêtres utilisant cette WindowProc).
    Ce qui n'est pas possible directement (il y a des moyens détournés), c'est créer deux fenêtre de même classe avec deux WindowProc différentes.

    Ici, tu sembles n'avoir aucune donnée static dans ta WindowProc, donc tu peux tout-à-fait créer deux fenêtres de la même classe.

Discussions similaires

  1. Affichage de plusieurs fenêtres
    Par johnrando dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/12/2014, 14h00
  2. Affichage d'une image dans plusieurs fenêtres
    Par DuffNut dans le forum C#
    Réponses: 4
    Dernier message: 14/03/2013, 16h17
  3. Interface graphique avec plusieurs fenêtres
    Par Copps dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 30/03/2005, 18h00
  4. Réponses: 2
    Dernier message: 09/10/2004, 11h35
  5. [DirectDraw7] Affichage de plusieurs image bmp
    Par SteelBox dans le forum DirectX
    Réponses: 3
    Dernier message: 24/04/2004, 19h00

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