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 :

Création dynamique d'un CDialog, problème d'ajout de controls


Sujet :

MFC

  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 159
    Points : 71
    Points
    71
    Par défaut Création dynamique d'un CDialog, problème d'ajout de controls
    Salut,

    Je veux créer un CDialog dynamiquement mais j'arrive pas à ajouter des controls: ajout de texte et de boutons

    la création des controls se fait avec succèes (pour ça je fais des tests) mais ils ne sont pas ajoutés à la fenêtre que je crée dynamiquement. Que dois je faire pour qu'ils soient ajoutés à cette fenêtre?? Merci par avance.

    voici le 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
    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
    114
    115
    116
    117
    118
     
     
    // DynamicDlg.cpp : implementation file
    //
     
    #include "stdafx.h"
    #include "ACTAR.h"
    #include "DynamicDlg.h"
    #include "ACTARDlg.h"
     
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
     
    /////////////////////////////////////////////////////////////////////////////
    // CDynamicDlg dialog
     
     
     
     
     
    IMPLEMENT_DYNCREATE(CDynamicDlg,CDialog)
     
     
    BOOL CDynamicDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
     
     
        //Ajouter le bouton "réduire", pas de bouton "agrandir"
    	SetWindowLong(this->m_hWnd, GWL_STYLE, GetWindowLong(this->m_hWnd, GWL_STYLE) | WS_MINIMIZEBOX );
     
    	//Afficher du texte dans l'espace client de la fenetre.
    	// le texte ne s'affiche pas!!!
    	CDC * Dc = GetDC( );
    	BOOL b = NULL;
    	if ( (b = TextOut(Dc->m_hDC,50,20,"hello",5)) == 0) AfxMessageBox("Echec de TextOut!!!");
     
    	//Création d'un bouton 
    	//le bouton n'est pas ajouté!!!
    	CButton  BoutonReessayer;
    	if ( BoutonReessayer.Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(90,50,100,30), this, 1) == 0) 
    					AfxMessageBox("Echec de la creation du bouton!!!");
     
    	return TRUE;  // return TRUE  unless you set the focus to a control
     
     
    }
     
     
     
     
    CDynamicDlg::CDynamicDlg()
    {
        m_hgbl=NULL;
    }
    CDynamicDlg::CDynamicDlg(int x,int y,int cx,int cy,const char *szTitle,CWnd* pParent /*=NULL*/)
    : CDialog()
    {
        //{{AFX_DATA_INIT(CDynamicDlg)
        // NOTE: the ClassWizard will add member initialization here
        //}}AFX_DATA_INIT 
        m_hgbl=NULL;
        SetDynamicDlg(x,y,cx,cy,szTitle,pParent);
    }
     
    void CDynamicDlg::SetDynamicDlg(int x,int y,int cx,int cy,const char *szTitle,CWnd* pParent /*=NULL*/)
    {
        // 
        LPDLGTEMPLATE lpdt;
        LPWORD lpw;
     
        if(m_hgbl) GlobalFree(m_hgbl);
        m_hDialogTemplate=NULL;
        m_hgbl=GlobalAlloc(GMEM_ZEROINIT,1024);
        lpdt = (LPDLGTEMPLATE)GlobalLock(m_hgbl);
     
        lpdt->style = WS_POPUP | WS_BORDER | WS_SYSMENU | DS_MODALFRAME | WS_CAPTION;
        lpdt->cdit = 0;
        lpdt->x = x;
        lpdt->y = y;
        lpdt->cx = cx;
        lpdt->cy = cy;
        lpw=(LPWORD) (lpdt+1);
        *lpw++=0;
        *lpw++=0;
        while(*szTitle) *lpw++=*szTitle++;
        *lpw++=0;
     
     
        GlobalUnlock(m_hgbl);
        InitModalIndirect(m_hgbl);
     
    }
     
    /*
    void CDynamicDlg::AjouterBouton(CACTARDlg  dlg){
    	CButton  BoutonReessayer;
    if (0 == BoutonReessayer.Create("My button", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
    												CRect(0,0,100,30), &dlg, 1)) AfxMessageBox("ERROR");
    }
    */
     
     
    CDynamicDlg::~CDynamicDlg()
    {
        if(m_hgbl) GlobalFree(m_hgbl);
    } 
     
    BEGIN_MESSAGE_MAP(CDynamicDlg, CDialog)
    //{{AFX_MSG_MAP(CDynamicDlg)
    // NOTE: the ClassWizard will add message map macros here
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    /////////////////////////////////////////////////////////////////////////////
    // CDynamicDlg message handlers

  2. #2
    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
    salut,
    un objet (ici un bouton) est détruit quand il sort de la portée ou il a été défini.(règle de base en C++) l'objet graphique Windows associé aussi...
    dans ton cas BoutonReessayer est local a OnInitDialog, donc il ne faut pas trop s'étonner si il n'apparait pas.

  3. #3
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 159
    Points : 71
    Points
    71
    Par défaut
    Merci pour ta réponse!

    Tu as tout à fait raison! mais je ne comprends pas pourquoi le bouton BoutonReessayer n'est pas ajouté alors que le bouton de réduction crée au meme en droit est ajouté à cette fenetre

    Mais je vois pas à quel moment je dois créer les controls pour qu'ils soient pris en compte, je suis débutanten MFC et je galère pour l'instant
    J'ai fait des recherche mais je n'ai pas trouvé de la doc qui parle de ça! Est ce que tu peux m'eclaircir un peu plus STP? Merci

  4. #4
    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
    re,
    le plus simple étant que ta variable bouton soit déclarée dans ta classe CDynamicDlg ...

  5. #5
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 159
    Points : 71
    Points
    71
    Par défaut
    Re,

    Je déclare maintenant le bouton BoutonReessayer en tant qu' attribut de la classe CDynamicDlg (la classe de la fenetre dynamique que je veux créer). J'ai fais aussi une méthode Ajouterbouton(Cwnd *) pour ajouter ce bouton.

    donc je déclare crée ma fenetre dynamiquement et pus j'appele AjouterBouton e, lui passant en paramètre le pointeur vers la fenetre dynamique. Voici le bout de code que j'appelle une fois la fenetre mère est créée:

    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
     
    /****Création de la fenetre fille *dlg  ****/
    CDynamicDlg * dlg = new CDynamicDlg (0,0,200,100,"Erreur d'authentification!",this);
    	dlg->DoModal();
    	dlg->AjouterBouton(dlg);// dlg c'est le pointeur vers la fenetre fille	
     
    /****Voici le code de la méthode AjouterBouton():****/
    //dlg la fenetre créée dynamiquement
    void CDynamicDlg::AjouterBouton(CWnd  * dlg)
    {
    // on peut remplacer dlg par this (c'est équivalent) car cette méthode 
    //est déclarée dans la classe CDynamicDlg, mais tjs le meme pb!
    if (0 == this->BoutonReessayer.Create("My button",
    WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(10,10,100,30), dlg, 1)) 
     
        AfxMessageBox("ERROR");
    }
    Mais cela échoue
    Par contre, quand je passe en paramètre un pointeur de la fenetre mère à la méthode AjouterBouton() (au lieu d'un ptr vers la fenetre fille) le bouton est crée et est ajouté mais à la fenetre mère!!

    Donc le problème vient de mon pointeur qui pointe vers la CDialog fille mais je vois pas où est le problème: j'instancie ma classe CDynamicDlg et j'arrive à créer la fenetre et je passe le pointeur en question mais ça marche pas

    Quelqu'un peut m'éclaircir SVP?
    Merci

  6. #6
    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
    salut,
    ça ne peut fonctionner ...,
    c'est une boîte de dialogue modale ce qui veut dire que l'exécution de la fonction appelante s'arrête tant que domodal n'a pas renvoyé une valeur de sortie (tant que la boîte de dialogue est affichée).
    donc ta fonction ajoutée bouton est hors contexte ,la dialogue n'existant plus.
    l'initialisation des contrôles supplémentaires doit se faire dans la fonction OnInitDialog de la dialogue , pourquoi se compliquer la vie ? .

  7. #7
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 159
    Points : 71
    Points
    71
    Par défaut
    Re,

    Effectivement je me suis compliqué la vie

    Il suffit de déclarer le controle comme attribut de la classe CDynamicDlg et puis dans la méthode OnInitDialogue() appeler la méthode Create du controle en question, ça marche nickel

    Mais toujours un petit problème: comment afficher du texte toujours dynamiquement? Pouvez vous me donner une piste??

    Merci pour votre aide

  8. #8
    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
    Citation Envoyé par vonemya
    Re,

    Effectivement je me suis compliqué la vie

    Il suffit de déclarer le controle comme attribut de la classe CDynamicDlg et puis dans la méthode OnInitDialogue() appeler la méthode Create du controle en question, ça marche nickel

    Mais toujours un petit problème: comment afficher du texte toujours dynamiquement? Pouvez vous me donner une piste??

    Merci pour votre aide
    c'est à dire ?

  9. #9
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 159
    Points : 71
    Points
    71
    Par défaut
    Je m'explique:

    Ce que je souhaite faire c'est créer dynamiquement des fenetres où il y a des boutons et l'utilisateur clickera sur un bouton en fonction du texte qui est affiché dans la partie client de CDialog.

    Exemple: après s'etre identifié (entré mot de passe et login) et une fois on a clické sur bouton connexion je crée une fenetre (toujours dynamiquement) où il y as le texte suivant par exemple "est ce que vous voulez que le web master retienne votre.....". puisque la création de cette fenetre est dynamique il faut que le texte soit ajouter dynamiquement mais pour l'insatant j'arrive pas

    J'ai fais des recherches et normalement je dois utiliser la méthode TextOut() (tu peux regarder le code que j'ai mis tout au début, il s'agit de la méthode OnInitDialog ) mais en vain

    Vraiment merci pour ton aide

  10. #10
    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
    salut,
    en gros tu es en train de refaire MessageBox ou AfxMessageBox ...
    pour ton texte tu n'as que le passer en argument dans le contructeur de ta classe ,ou par une méthode avant DoModal,
    tu stockes la valeur dans une CString et tu l'affiches dans un static dans OnInitDialog..

  11. #11
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 159
    Points : 71
    Points
    71
    Par défaut
    Salut,
    Je ne suis pas en train de refaire MessageBox(), c'était juste pour simplifier mon explication. C'est vrai pour des CDialog avec des boutons et du texte le MessageBox sont très pratiques.

    Effectivement avec CStatic ça marche nickel sauf que commme je suis débutant je connaissais pas cette classe, j'étais as effiace dans ma recherce sur le site de Microsoft.

    Je marque donc la discussion comme résolue et voici la conclusion pour que tous les débutant en profitent.

    Pour habiller dynamiquement une Cdialog, il faut déclarer les control en tant que Attribut à la classe de la fenetre dynamique puis dans la méthode OnInitDialog on appelle la méthode create de chacun des ces controls. Voilà c'est à peu près ça. Pour certain c'est évident mais pour un débutant comme moi ça ne l'est pas je pense

    Merci beaucoup pour ton aide

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/02/2010, 18h49
  2. Réponses: 0
    Dernier message: 27/10/2008, 16h31
  3. problème avec création dynamique de popup
    Par Melianos dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 31/07/2008, 14h21
  4. Réponses: 3
    Dernier message: 16/05/2006, 17h24
  5. [Rave Report] problème de création dynamique
    Par Nivux dans le forum Rave
    Réponses: 2
    Dernier message: 24/05/2003, 01h07

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