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 :

Activer/Désactiver un CButton dans une boite de dialogue


Sujet :

MFC

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 29
    Points : 31
    Points
    31
    Par défaut Activer/Désactiver un CButton dans une boite de dialogue
    Bonjour à tous,
    j'aimerais activer ou désactiver le bouton Ok de ma boîte de dialogue en fonction de la taille de mon élément (si elle est paire ou non). Mais j'ai eu bien beau chercher sur le net, rien de ce que j'ai pu trouver n'a fonctionner. Je sais le réalisé sous java avec un caretListener avec setEnabled(bool) mais pas en c++ sous visual studio 10.

    Je viens donc vers vous pour solliciter votre aide qui m'a été précieuse dans le passé.

    Merci d'avance.

    Ci-dessous : la photo de la BDD
    Images attachées Images attachées  

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Je ne vois pas trop le problème.

    CWnd::EnableWindow
    http://msdn.microsoft.com/en-us/library/5kbfsahf.aspx

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 29
    Points : 31
    Points
    31
    Par défaut
    J'ai essayé cela sinon je n'aurai pas posté le poste si je ne trouvai pas avant ailleurs.

    voici le code que j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void CLIstaseDoc::OnFiltresMoyenneur()
    {
    	CDialFiltre bddFiltre;
    	bddFiltre.m_OkFiltre.EnableWindow(false);
    	if(bddFiltre.DoModal()==IDOK)
    	{
    		m_Image=m_Image.FiltreMoyenneur(5);
    		UpdateAllViews(NULL);
    	}
    }
    bddFiltre est l'image de la boîte de dialogue ci-dessus.
    m_OkFiltre est une variable associé à mon bouton Ok.

    Je génère pas de souci, mais au moment de lancer l'action en cliquant dans le menu, j'ai le message d'erreur en pièce jointe.

    Je fais surement quelque chose de mal. Désolé, ce n'est pas facile quand on connait rien en MFC. En plus, je ne sais pas dans quelle fichier provient l'erreur mais je pense que c'est la ligne bddFiltre.m_OkFiltre.EnableWindow(false); qui la provoque.

    Je peux uploader mon projet s'il le faut.

    Merci quand même pour ta réponse aussi rapide bacelar.
    Images attachées Images attachées  

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Février 2006
    Messages : 562
    Points : 859
    Points
    859
    Par défaut
    Vous pouvez acceder aux propriétés de vos controles qu'aprés avoir passé par la fonction OnInitDialog, d'ou votre message d'erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    BOOL CDialFiltre::OnInitDialog()
    {
      CDialogEx::OnInitDialog();
      m_OkFiltre.EnableWindow(FALSE);
      return TRUE;
    }
    Ensuite ajouter un gestionnaire d'évenement pour le message EN_CHANGE du controle CEdit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void CDialFiltre::OnEnChangeEdit1()
    {
    	CString strTmp;
     
    	// on recupère le texte entrée par l'utilisateur
    	GetDlgItem(IDC_EDIT1)->GetWindowText(strTmp);
     
    	if (....)
    		m_OkFiltre.EnableWindow(FALSE);
    	else
    		m_OkFiltre.EnableWindow(TRUE);
    }

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 29
    Points : 31
    Points
    31
    Par défaut
    Merci ddaime aussi pour la réponse je pense que ca va beaucoup m'aider. Tu es mon sauveur. Cependant j'ai des soucis avec le code que tu m'as donnée. J'ai mis ces deux codes dans mon fichier CDialFiltre.cpp et j'ai ajouté aussi les fonctions dans le .h. Mais j'ai encore des erreurs.

    Notamment sur cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CDialogEx::OnInitDialog();
    Il me dit
    Error : Une référence d'objet non statique doit être relative à un objet spécifique
    Après pour le reste sa va, normalement il n'y a plus qu'à tester.

    Merci encore, si ça marche tu m'enlève une épine du pied.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    C'est tout simplement parce que votre class "CDialFiltre" ne dérive pas directement de "CDialogEx".

    Remplacez "CDialogEx" dans la ligne
    CDialogEx::OnInitDialog();
    par le nom de la classe mère de "CDialFiltre".

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 29
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par bacelar Voir le message
    C'est tout simplement parce que votre class "CDialFiltre" ne dérive pas directement de "CDialogEx".

    Remplacez "CDialogEx" dans la ligne

    par le nom de la classe mère de "CDialFiltre".
    Merci mais j'ai une boucle infinie du coup j'avais essayé avec CDialog car CDialogFiltre dérive de CDialog. Mais j'ai une erreur lorsque je lance le programme :

    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
     
    BOOL CDialFiltre::OnInitDialog()
    {
      CDialog::OnInitDialog();
      m_OkFiltre.EnableWindow(TRUE);
      return TRUE;
    }
     
    void CDialFiltre::OnEnChangeTaille()
    {
    	if (m_dTailleElem%2==0)
    		m_OkFiltre.EnableWindow(FALSE);
    	else
    		m_OkFiltre.EnableWindow(TRUE);
    }
    L'erreur est la suivante en pièce jointe. Franchement, je commence a désespérer.
    Images attachées Images attachées  

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Pas de panic.

    Vous avez une boucle infinie si vous faites un appel récursif en oubliant de spécifier le nom de la classe mère.

    j'avais essayé avec CDialog car CDialogFiltre dérive de CDialog
    Nickel si CDialog est bien la classe mère de CDialogFiltre et non une classe ancêtre (mère de mère, ...) .

    J'ai l'impression que vous avez peur de regarder dans le code des MFC.
    Les MFC sont fournies avec leurs sources et cela est un gros avantage.

    Les fenêtres que vous fournissez dans vos post ne sont pas des fenêtres de plantage.
    Ce sont des fenêtres d'alerte des MFC qui ont détecté une incohérence dans les données quelles manipules.

    En cliquant sur le bouton "Recommencer" vous arriverez, via le débuggeur de VS, sur la ligne où l'incohérence a été détectée par les MCS.
    Généralement c'est une MACRO de type ASSERT.
    C'est cool la version DEBUG, mais attention car ces check disparaissent en mode Release.

    A en croire la copie d'écran, vous utilisez VC7.0, je ne dispose pas de cette version de VS ni des fichiers sources correspondant mais dans la version VS2008(VC9.0), la plus ancienne de celles dont je dispose, la ligne 40 du fichier dlgdata.cpp correspond à :

    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
    HWND CDataExchange::PrepareCtrl(int nIDC)
    {
    	ASSERT(nIDC != 0);
    	ASSERT(nIDC != -1); // not allowed
    	HWND hWndCtrl;
       COleControlSite* pSite = NULL;
    	m_pDlgWnd->GetDlgItem(nIDC, &hWndCtrl);
    	if (hWndCtrl == NULL)
    	{
    	  // Could be a windowless OCX
    	  pSite = m_pDlgWnd->GetOleControlSite(nIDC);
    	  if (pSite == NULL)
    	  {
    		   TRACE(traceAppMsg, 0, "Error: no data exchange control with ID 0x%04X.\n", nIDC);
    		   ASSERT(FALSE);
    		   AfxThrowNotSupportedException();
    	  }
    	}
    	m_idLastControl = nIDC;
    	m_bEditLastControl = FALSE; // not an edit item by default
    
       return hWndCtrl;
    }
    Donc pSite est null (=m_pDlgWnd->GetOleControlSite(nIDC)

    Donc si vous avez le même type de code que moi, cela n'a plus rien à voir avec le EnableWindow, mais plus avec l'initialisation de contrôles complexes dans votre boîte de dialogue.

    En utilisant le débuggeur de VS vous aurez accès à la pile d'appel et vous saurez les motifs de cet appel.
    Je pense à "UpdateAllViews(NULL);" qui appel "UpdateData" qui appel les DDX/DDV des contrôles de la boîte de dialogue qui appelera le "PrepareCtrl" fautif.

    Si vous commentez les "EnableWindow" et si l'application se remet à fonctionner, c'est que c'est bien les "EnableWindow" qui "vérole" les données des fenêtres (peu probable mais pas impossible). Mais c'est à vérifier.

    Je vais prendre la convention d'appeler la fenêtre, l'objet géré pas les MFC et contrôle l'objet géré par le Kernel Windows. La fenêtre MFC contiendra un contrôle opérationnel qu'après la fin du processus appelé par "OnInitDialog".

    Le code de "OnEnChangeTaille" m'intrigue un peu.
    EnableWindow ne devrait être appelé que sur des fenêtres dont le contrôle est déjà créé donc après la fin de "OnInitDialog".
    Est-ce le cas ? Sinon, il faudra vérifier l'existence du contrôle avant l'appel à "EnableWindow".

    Mais plutôt que de faire des hypothèses, vérifiez avec un débuguer le motif de l'appel et le contexte, cela permettra d'y voir plus claire.

Discussions similaires

  1. Comment recuperer les info d'un formulaire dans une boite de dialogue
    Par frutix dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 31/05/2006, 11h42
  2. [VB]Afficher une liste dans une boite de dialogue
    Par Asdorve dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 05/04/2006, 11h30
  3. Caractères spéciaux dans une boite de dialogue
    Par Rafiki dans le forum Général JavaScript
    Réponses: 22
    Dernier message: 09/03/2006, 14h05
  4. [MFC] Dessin dans une boite de dialogue .
    Par Platypus dans le forum MFC
    Réponses: 8
    Dernier message: 21/07/2005, 11h21
  5. afficher dans une boite de dialogue la valeur d'une variable
    Par micknic dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 10/07/2005, 09h25

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