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

MFC Discussion :

Ajouter dynamiquement des controles.


Sujet :

MFC

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Ajouter dynamiquement des controles.
    Bonjour,
    Je voudrais implementer un programme qui permette d'ajouter/supprimer dynamiquement un groupe de controle à un dialogue. Cela pourrait ressembler au screenshot suivant; A chaque clic sur le bouton ajouter, les 2 controles edit et le bouton supprimer sont automatiquement ajoutés.
    merci


  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    pour créer dynamique un controle (bouton, edit) il faut:
    1/ Déclarer ton controle et créer une instance. Par exemple A ceci près que dans ton cas, il te faudra certainement stocker ces instances dans un vecteur.

    2/ Créer le contrôle (plus précisément, sa partie graphique), en utilisant la méthode Create dudit contrôle.

    3/ Le placer à l'endroit désiré (méthode SetWindowPos).

    Hope it helps.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 34
    Points : 32
    Points
    32
    Par défaut Ajout dynamique de CEdit et CButton
    Bonjour,

    je cherche à faire à peu près la même chose que toi, c'est à dire ajouter des boutons et des zones de textes suite à une valeur entrée par l'utilisateur. Je voulais donc savoir si tu avais résolu ton problème et comment

    Merci de ta réponse

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Les controles peuvent aussi être pré-créés invisibles statiquement dans l'éditeur de dialogue, puis rendus visibles à l'exécution selon les besoins.
    Ca permet d'éviter de se prendre la tête avec le positionnement.

    Ceci bien entendu à condition que le nombre de "nouveaux" controles potentiels soit connu à l'avance.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 34
    Points : 32
    Points
    32
    Par défaut
    Je te remercie pour ta réponse mais c'est vrai que le nombre de boutons et zone de texte à ajouter ne sont pas connus à l'avance...

    En attendant comment peut-on faire pour que ça soit invisible au début?

    Merci de votre réponse

  6. #6
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Pour rendre un contrôle invisible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    moncontrole->ShowWindow(WS_HIDE);
    valable pour tout controle qui hérite de CWnd.

    Sinon, j'ai expliqué comment faire pour ajouter des boutons et des zones de textes dynamiquement quelques posts plus tôt

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Citation Envoyé par ptitanic07
    Je te remercie pour ta réponse mais c'est vrai que le nombre de boutons et zone de texte à ajouter ne sont pas connus à l'avance...

    En attendant comment peut-on faire pour que ça soit invisible au début?
    Si leur nombre n'est pas connu au début, il faut mettre en place un schéma de positionnement (+ taille) et les créer dynamiquement.

    S'il faut que des controles précédemment créés puissent être supprimés aléatoirement par la suite, le mieux est d'utiliser une liste pour stocker les pointeurs ; sinon un simple tableau dynamique devrait suffire.

  8. #8
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    Citation Envoyé par rigobert
    Les controles peuvent aussi être pré-créés invisibles statiquement dans l'éditeur de dialogue, puis rendus visibles à l'exécution selon les besoins.
    Ca permet d'éviter de se prendre la tête avec le positionnement.

    Ceci bien entendu à condition que le nombre de "nouveaux" controles potentiels soit connu à l'avance.
    au lieu du probleme de repositionnement, tu auras le probleme de recopie d'information

    EDIT1 : AAAAAAAA
    EDIT2 : BBBBBBBBB
    EDIT3 : CCCCCCCC
    EDIT4 : DDDDDDDD

    Cacher l'EDIT2 revient à recopier les donnée de l'EDIT3 dans l'EDIT2 + recopier les donnée de l'EDIT4 dans l'EDIT3 et cacher l'EDIT4 sinon tu auras un "trou" entre l'EDIT1 et l'EDIT3


    donc au niveau de la complexité cela revient au meme

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Citation Envoyé par la drogue c'est mal
    au lieu du probleme de repositionnement, tu auras le probleme de recopie d'information

    EDIT1 : AAAAAAAA
    EDIT2 : BBBBBBBBB
    EDIT3 : CCCCCCCC
    EDIT4 : DDDDDDDD

    Cacher l'EDIT2 revient à recopier les donnée de l'EDIT3 dans l'EDIT2 + recopier les donnée de l'EDIT4 dans l'EDIT3 et cacher l'EDIT4 sinon tu auras un "trou" entre l'EDIT1 et l'EDIT3


    donc au niveau de la complexité cela revient au meme
    Oui enfin sauf que ma solution prenait comme hypothèse que le nombre d'items est fini et connu à l'avance.

    Donc pas de nécessité de recycler les controles, donc pas de recopies de texte, donc pas de trous, donc ... pas de complexité

    De toute façon il y a à mon humble avis un problème de conception : ce type d'interface n'est pas vraiment adapté à l'objectif fixé ; en effet si le nombre d'items peut croître indéfiniment il faudra ajouter une scrollbar et gérer un scrolling des controles. Donc pas mal de boulot en perspective pour un résultat peu académique.
    Il serait certainement beaucoup plus judicieux de faire dès le départ par exemple une liste customisée, dont un des bénéfices serait de proposer à l'utilisateur une interface plus conventionnelle, donc plus conviviale.

  10. #10
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 34
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par rigobert
    Si leur nombre n'est pas connu au début, il faut mettre en place un schéma de positionnement (+ taille) et les créer dynamiquement.

    S'il faut que des controles précédemment créés puissent être supprimés aléatoirement par la suite, le mieux est d'utiliser une liste pour stocker les pointeurs ; sinon un simple tableau dynamique devrait suffire.



    Je suis désolée mais je ne comprends pas trop ce que tu me conseilles. Je débute avec la librairie MFC. Ce que je ne comprends pas, c'est comment je définis de nouveaux contrôles sans le IDC_BUT présent dans le Resource.h
    Merci de la réponse


  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    En fait le IDC_BUT n'est rien de plus qu'un numéro d'identification (unique dans le dialogue) du controle.
    Dès lors que tu respectes ce principe d'unicité, n'importe quelle valeur fait l'affaire.

    Ensuite pour créer "manuellement" un controle, il suffit d'appeler sa méthode Create() (parfois surchargée), tous les controles basiques MFC en ont une.

    Il faut juste faire l'effort de regarder leur documentation

  12. #12
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 34
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par rigobert
    En fait le IDC_BUT n'est rien de plus qu'un numéro d'identification (unique dans le dialogue) du controle.
    Dès lors que tu respectes ce principe d'unicité, n'importe quelle valeur fait l'affaire.

    Ensuite pour créer "manuellement" un controle, il suffit d'appeler sa méthode Create() (parfois surchargée), tous les controles basiques MFC en ont une.

    Il faut juste faire l'effort de regarder leur documentation

    J'ai bien compris qu'un IDC_BUT devait être unique ,c 'est justement cette unicité qui n'est pas évidente à mettre en oeuvre. Merci pour tous tes conseils masi vu que ma conception smeble trop compliqué pour l'implémenter,je vais revoir ça.

  13. #13
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salu,
    si tu dois avoir un nombre de saisie variable ,un contrôle de type grid peut etre indiqué.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Citation Envoyé par ptitanic07
    J'ai bien compris qu'un IDC_BUT devait être unique ,c 'est justement cette unicité qui n'est pas évidente à mettre en oeuvre.
    ???

    Pour progresser en programmation il faut être un minimum curieux :
    si tu fouines un peu dans resource.h, tu verras que ce fameux IDC_BUT qui a l'air de susciter tant d'angoisse n'est qu'un bête #define !

    Donc si par ex IDC_BUT vaut 100 et que tu souhaites ajouter 3 nouveaux boutons manuellement, tu pourrais écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #define IDC_BUT 100
    ...
    #define IDC_BUT2 101
    #define IDC_BUT3 102
    #define IDC_BUT4 103
    Ainsi le principe d'unicité des identifiants est respecté.

    A l'inverse, ceci ne marcherait pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #define IDC_BUT 100
    ...
    #define IDC_BUT2 100
    #define IDC_BUT3 102
    #define IDC_BUT4 102
    La différence entre le faire manuellement et le faire par l'éditeur de boite de dialogue, c'est que ce dernier fait attention pour toi de toujours générer des identifiants uniques pour chacun des controles d'une boite donnée.

    C'est pas plus compliqué que ça !

  15. #15
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 34
    Points : 32
    Points
    32
    Par défaut
    je dois mal m'exprimer .......
    j'avais bien été curieurse et avait bien vu où les IDC étaient crées mais mon gros problème était que je ne savais pas combien de boutons allés être rajouter.
    Merci pour tous tes conseils et pour résoudre le problème j'ai revu ma conception... Les CListBox, c'est plus simple

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Citation Envoyé par ptitanic07
    je dois mal m'exprimer .......
    j'avais bien été curieurse et avait bien vu où les IDC étaient crées mais mon gros problème était que je ne savais pas combien de boutons allés être rajouter.
    Dans ce cas il aurait suffi de prévoir une plage pour les controles statiques et une pour les controles dynamiques, qui se serait située au-dessus.

    Un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // plage statique
    #define IDC_STATIC_1 100
    #define IDC_STATIC_2 101
     
    ...
     
    // plage dynamique
    #define IDC_PREMIER_DYN 200
    Ensuite dans ta fonction de création de controles dynamiques tu aurais maintenu un identifiant variable, initialisé à IDC_PREMIER_DYN, et qui aurait été incrémenté à chaque nouvelle création. Et voilà.

    Enfin, si tu fais une liste, tu t'affranchiras aussi du même coup de ce problème d'identifiant.

  17. #17
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par hopsoid
    Bonjour,
    Je voudrais implementer un programme qui permette d'ajouter/supprimer dynamiquement un groupe de controle à un dialogue. Cela pourrait ressembler au screenshot suivant; A chaque clic sur le bouton ajouter, les 2 controles edit et le bouton supprimer sont automatiquement ajoutés.
    merci
    C'est relativement aisé à faire ; il suffit d'appeler CButton::Create() fournir un ID qui sera incrémenté.
    Il faut empiler les CButton dans un CArray,CObArray, tableau dynamique.
    Si j'ai un instant je peux te faire un petit code source

Discussions similaires

  1. problème ajouter dynamiquement des controls
    Par braali dans le forum ASP.NET
    Réponses: 8
    Dernier message: 22/03/2010, 17h07
  2. [WebForms]Ajouter dynamiquement des checkbox
    Par ardi dans le forum Général Dotnet
    Réponses: 6
    Dernier message: 07/04/2006, 15h01
  3. ajouter dynamiquement des items dans un popup menu
    Par Malone dans le forum Composants VCL
    Réponses: 7
    Dernier message: 23/08/2005, 17h08
  4. Réponses: 2
    Dernier message: 10/05/2005, 16h54
  5. [VBA-E] Est il possible de creer dynamiquement des controles en VBA
    Par bbkenny dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 13/08/2004, 21h04

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