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 :

probleme fenetres winapi


Sujet :

Windows

  1. #1
    Membre averti
    Homme Profil pro
    rien
    Inscrit en
    Février 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : rien
    Secteur : Services de proximité

    Informations forums :
    Inscription : Février 2013
    Messages : 13
    Par défaut probleme fenetres winapi
    Bonjour tout le monde!
    je suis en train d'apprendre la prog winapi et je suis face à un problème qui me désespère.(depuis 2 jours)

    j'ai une fenêtre winapi sur laquelle j'ai placé des contrôles(boutons,checkbox,etc...) et je veut faire en sorte que lorsque je clique sur le bouton, la fenêtre change de "disposition"(des controles différents), un peu comme un lien qui mène vers une autre page(mais dans la même page).
    (comme les programmes d'installation quand on clique sur suivant,suivant,suivant)

    résultat:
    Soit je recréé une autre fenêtre en détruisant la précédente mais à ce moment là elle est déplacée(nouvelle fenêtre).
    Soit je créé une fenêtre fille dans le main,que je détruis pour la refaire en appuyant sur le bouton :les contrôles de la première fenêtre ne se voient plus,mais sont toujours actifs!?
    je voudrais faire ça sans les dialogbox, ni fichier res...

    je demande donc votre aide pour m'expliquer l'astuce, ou (mieux)si quelqu'un aurait un petit bout de code avec un bouton "suivant" pour que je puisse l'étudier.
    (PS: à ce stade de la galère, je commence à trouver plus facile de créer du GUI par SDL que par du winapi! alors que je sais bien que c'est l'inverse.)
    Merci d'avance!

  2. #2
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 532
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 532
    Par défaut
    Salut tout cela est bien compliqué pour pas grand chose...
    bon ok l'API win32 c'est pas aussi facile que d'afficher une fenêtre en dot NET
    ceci dit pour l'initialiser on capte soit le message WM_INITDIALOG si tu crées une fenêtre dialogue avec CreateDialog ou CreateDialogIndirect
    Soit avec WM_CREATE
    Avec ces messages ça permet de faire l'initialisation dans la gestion des messages de la "procédure" de fenêtre ( du genre BOOL CALLBACK FenetreProc(HWND...)
    Ensuite pour gérer les contrôles c'est pas si difficile que ça il suffit de capter WM_COMMAND et les mots wParam ou lParam pour le type de message ( ex BN_CLICK pour un bouton ) et le ID ressource du contrôle

    Les contrôles se gérent essentiellement par leur handle de type HWND ou bien leur ID ressource.
    Il suffit d'appeler GetDlgItem pour obtenir le HWND et pour le déplacer MoveWindow()
    Maintenant pour changer de fenêtre soit tu fais apparaître des contrôles visibles à l'affichage de la fenêtre avec ShowWindow(HWND,..) soit non visible
    Soit on les détruit tout simplement avec DestroyWindow..

    Je sais que l'API Windows c'est pas facile au début mais lorsqu'on commence à piger c'est extrêmement puissant tu pourras faire tout ce que tu veux sous Windows dans les limites de l'OS...

    quant à SDL c'est facile pour les débutants mais c'est lent..

    Citation Envoyé par leyhodolerondunord Voir le message
    Soit je créé une fenêtre fille dans le main,que je détruis pour la refaire en appuyant sur le bouton :les contrôles de la première fenêtre ne se voient plus,mais sont toujours actifs!?
    pour détruire les contrôles il suffit de faire DestroyWindow(hwnd_du_controle)
    Pour en recréer un il suffit d'appeler CreateWindowEx voir le MSDN.

    Pour rendre inactif un bouton il suffit d'appeler EnableWindow(hwnd,FALSE)

  3. #3
    Membre averti
    Homme Profil pro
    rien
    Inscrit en
    Février 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : rien
    Secteur : Services de proximité

    Informations forums :
    Inscription : Février 2013
    Messages : 13
    Par défaut
    Donc,si j'ai bien compris, il me faut créer TOUT les contrôles à l'avance en HIDDEN et jouer avec ShowWindow()?

    peut on regrouper les contrôles en "pages" afin de les traiter tous avec un seul ShowWindow() par page, et non pas 1 ShowWindow() par contrôle?


    Dans touts les cas merci à toi Mat.M!

  4. #4
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 532
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 532
    Par défaut
    Citation Envoyé par leyhodolerondunord Voir le message
    peut on regrouper les contrôles en "pages" afin de les traiter tous avec un seul ShowWindow() par page, et non pas 1 ShowWindow() par contrôle?
    salut pour chaque contrôle donné il y a un ID ressource associé ou bien un HWND; donc il suffit de faire une classe de contrôle et de les mettre dans un std::vector en C++ ou une liste chainée en C.
    Tu peux avoir une classe
    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
    class CControl
    { HWND m_hwnd;
     int m_nID;
    // puis la position du contrôle
    bool m_bVisible;
    public :
    CControl(HWND hwndParent,HINSTANCE hinstance);
    ~CControl() { DestroyWindow(m_hwnd); };
    void SetVisible(bool bVisible);
    };
    
    // puis le constructeur
    CControl::CControl(HWND hwndParent,HINSTANCE hinstance,int X,int Y,int nWidth,int nHeight,int nResID )
    {
    
    m_hwnd= CreateWindow ("button", "Push Button", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,X,Y, nWidth, nHeight , hwndParent, (HMENU)nResID,hinstance,NULL);
    m_nID=nResID ;
    m_bVisible=true;
    
    }
    
    void CControl::SetVisible(bool bVisible)
    {
    bVisible==true ? ShowWindow(m_hwnd,SW_SHOW,SW_HIDE);
    m_bVisible=bVisible;
    
    
    void CControl::SetText(std::string strText)
    {
    SetWindowText(m_hwnd,strText.c_str());
    }
    }
    Ensuite il faut créer une std::vector<CControl> ou std::list ;
    le pointeur de ressources il suffit de l'incrémenter après chaque appel du constructeur de CControl.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CControl *pControl;
    int y=10;
    std::vector<CControl *> liste_controles;
    int nPointeurRessources=1; // attention à prendre un ID ressource pertinent
    pControl=new CControl(hwndParent,hinstance,10,y,100,25,nPointeurRessources);
    y+=30;
    
    liste_controles.push_back(pControl);
    nPointeurRessources++;
    
    /// pour les masquer
    for( int i=0;i<liste_controles.size();i++)
    liste_controles[i].SetVisible(false);
    A noter qu'on peut obtenir le HINSTANCE d'application avec GetWindowLong
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    HINSTANCE hInstance=(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE);
    comme ça pas besoin de MFC ni QT inutiles

    Si tu veux regrouper les contrôles on peut utiliser un "GroupBox"

    http://msdn.microsoft.com/en-us/libr.../aa511459.aspx

    cela permet de les cacher ou non

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Si tu veux faire un "assistant" (Wizard en anglais) pourquoi ne pas utiliser ce que Windows t'offre pour ça: Les Property Sheets en mode Wizard.
    Bien sûr, c'est plus compliqué que faire une fenêtre soi-même, mais probablement plus simple que faire toutes les fenêtres soi-même, gérer l'enchaînement, gérer les cas bizarres, etc.

    La première chose à savoir, c'est que chaque page n'est pas une fenêtre ordinaire, mais une boîte de dialogue, donc gérée différemment des fenêtres ordinaires: Les contrôles sont définis par un "dialog template" (le plus souvent défini en ressource) et la Window Proc est remplaçée par une Dialog Proc.

    La première chose à faire serait d'apprendre comment faire une boîte de dialogue. Ensuite, en faire plusieurs dans une Property Sheet, puis en faire un Wizard.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre averti
    Homme Profil pro
    rien
    Inscrit en
    Février 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : rien
    Secteur : Services de proximité

    Informations forums :
    Inscription : Février 2013
    Messages : 13
    Par défaut
    re-bonjour, veuillez m'excuser pour le retard, j'ai adapté un de mes anciens programmes console en winapi en utilisant la méthode"tout en hidden et cas par cas avec showWindow()", un grand merci donc à Mat.M pour ta réponse,je vais étudier plus en profondeur les codes de ta deuxième réponse.
    vraiment merci de m'avoir permis de ne pas perdre plus de temps pour rien.
    merci Médinoc pour ta réponse, je vais me renseigner sur les"property sheets en mode wizard.(ils est toujours bon de voir ce qui existe)
    Mais sachant que je me suis pas mal habitué(à cause de la sdl)à gérer les dits enchainnements et autre cas "bizarres".
    je passe par des fonction du style "setmenu_1()".
    Dans tout les cas merci à vous pour vos conseils utiles.
    Je clos maintenant le sujet.
    Au revoir!

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    149
    Par défaut
    Bonjour,

    quant à SDL c'est facile pour les débutants mais c'est lent..
    Ceci est faux, depuis la SDL 2 ( http://jeux.developpez.com/actu/5979...GL-3-0-arrive/ )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

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

Discussions similaires

  1. Probleme fenetre Netbeans 5.5
    Par jean.inconnu dans le forum NetBeans
    Réponses: 2
    Dernier message: 24/04/2007, 13h30
  2. Probleme fenetre MDI
    Par chris81 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 04/04/2007, 09h06
  3. [WinDev 10] Problème fenêtre interne
    Par slick42 dans le forum WinDev
    Réponses: 7
    Dernier message: 14/08/2006, 11h02
  4. [c#] probleme fenetre non rectangulaire
    Par orelero dans le forum Windows Forms
    Réponses: 2
    Dernier message: 27/12/2005, 12h32
  5. [langage] fonction sleep + probleme fenetre dos
    Par yokito dans le forum Langage
    Réponses: 2
    Dernier message: 30/08/2003, 19h46

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