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 :

*Comment récupérer les ID des boutons de boites standards


Sujet :

MFC

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut *Comment récupérer les ID des boutons de boites standards
    Salut,

    Pour certaines boîtes, je peux me galérer à tomber sur les boites dans les common.rc de la MSDN.

    Par contre, même quand il s'agit de l'ID du bouton "Enregistrer" pour la boîte de type CFileDialog, aucune idée de comment faire.

    Le but est d'utiliser la fonction
    dlg.SetControlText(int nID, LPCSTR lpsz)
    pour changer le texte et mettre par exemple "OK" (car ça n'enregistre pas tout de suite puisque je me sers dans un premier temps juste du nom de fichier choisi).

    Merci.

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    pour ton application ?

    tu peux utiliser spy++ ou un enumChildWindow

  3. #3
    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,
    le plus simple est d'utiliser spy .
    voir autre technique utilisée sur une CFileDialog dans la faq:
    http://c.developpez.com/faq/vc/?page...OnChangeSelect


  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Citation Envoyé par nico-pyright(c)
    pour ton application ?
    Mais non, pas pour les boutons que j'ai moi-même créé.

    Pour l'exemple concret du bouton "Enregistrer" de la CFileDialog, comment tu ferais par exemple?

  5. #5
    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 stof
    Citation Envoyé par nico-pyright(c)
    pour ton application ?
    Mais non, pas pour les boutons que j'ai moi-même créé.

    Pour l'exemple concret du bouton "Enregistrer" de la CFileDialog, comment tu ferais par exemple?
    tu peux parcourir dynamiquement les boutons de la fenetre et chercher le titre du bouton qui t'interesse ...
    voir mon post precedent.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Méthode 1 : Spy++

    En écarcillant les yeux comme un malade dans Spy++, j'ai fini par repérer une ligne où iil y a marqué :
    Fenêtre 00350166 "&Enregistrer" Button
    Là dans "Général", je vois l'ID du bouton 00000001
    Mais ce n'est pas ça puisque quand j'essaie de l'utiliser ça ne marche pas:
    dlg.SetControlText(0x00000001, "texte");
    dlg.SetControlText(16, "texte");
    dlg.SetControlText(1, "texte");
    dlg.SetControlText(00000001, "texte");



    En attendant de comprendre le fonctionnement de cet outil, j'essaie quand-même la méthode 2

    Méthode 2 : Boucle artisanale pour faire le tour des contrôles
    J'ai remplacé "ComboBox" par "Button" mais de toutes façons je n'ai que des chaînes vides en retour.


  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    :

  8. #8
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par stof
    Méthode 1 : Spy++

    En écarcillant les yeux comme un malade dans Spy++, j'ai fini par repérer une ligne où iil y a marqué :


    Menu >>Search >>Find Window Alt F3 >>Specifiez la fenêtre en déplaçant l'outil de sélection ( cercles concentriques ) au-dessus des fenêtres


    Cliquer sur l'outil Finder Tool , maintenir le bouton gauche de la souris
    Un curseur avec cercles concentriques apparaît.
    Le déplacer sur la fenêtre , le bouton , la zone de texte à sélectionner.

    Par exemple en dessinant avec MsPaint puis enregistrer on obtient :
    Handle : 000401EE - Caption : "Enregistrer" - Class: "Button"

    Après avec des API Windows on peut déterminer les fenêtres qui sont ouvertes déterminer les types de contrôles etc....

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    OK mat.M pour l'outil cercles concentriques; ça permet de ne plus avoir à "écarciller les yeux", lol.


    Mais ça ne répond toujours pas à mon problème:
    Gardons toujours cet exemple de la boite CFileDialog d'enregistrement, voilà les ID que Spy++ me retourne :
    - Bouton Enregistrer : 00000001
    - Texte Static Nom de fichier : 00000442

    C'est bien mais je fais quoi avec ça?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //Filtre sur les formats d'image sauvegardables
    	CString strFilter="Bitmap image (type *.bmp)|*.bmp|JPEG image (type *.jpg)|*.jpg|GIF image (type *.gif)|*.gif|PNG image (type *.png)|*.png||";
     
    	CFileDialog dlg(FALSE,NULL,"image",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_EXPLORER,strFilter);
    	dlg.m_ofn.lpstrTitle="Enregistrer l'image";
    	CString s = "Mon nouveau texte";
    	dlg.SetControlText(0x00000001, s);	//plante!!
       dlg.SetControlText(1, s);	//plante!!
    	dlg.GetDlgItem(0x00000442)->SetWindowText(s); //plante!!
    	dlg.GetDlgItem(1090)->SetWindowText(s);  //plante!!
     
    	HRESULT hResult = (int)dlg.DoModal();

  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
    Citation Envoyé par stof
    OK mat.M pour l'outil cercles concentriques; ça permet de ne plus avoir à "écarciller les yeux", lol.


    Mais ça ne répond toujours pas à mon problème:
    Gardons toujours cet exemple de la boite CFileDialog d'enregistrement, voilà les ID que Spy++ me retourne :
    - Bouton Enregistrer : 00000001
    - Texte Static Nom de fichier : 00000442

    C'est bien mais je fais quoi avec ça?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //Filtre sur les formats d'image sauvegardables
    	CString strFilter="Bitmap image (type *.bmp)|*.bmp|JPEG image (type *.jpg)|*.jpg|GIF image (type *.gif)|*.gif|PNG image (type *.png)|*.png||";
     
    	CFileDialog dlg(FALSE,NULL,"image",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_EXPLORER,strFilter);
    	dlg.m_ofn.lpstrTitle="Enregistrer l'image";
    	CString s = "Mon nouveau texte";
    	dlg.SetControlText(0x00000001, s);	//plante!!
       dlg.SetControlText(1, s);	//plante!!
    	dlg.GetDlgItem(0x00000442)->SetWindowText(s); //plante!!
    	dlg.GetDlgItem(1090)->SetWindowText(s);  //plante!!
     
    	HRESULT hResult = (int)dlg.DoModal();
    salut,
    ton code ne peut fonctionner ,tu commets une erreur que j'ai maintes fois signalée.
    en dehors de l'objet lui meme les controles d'une boite de dialogue ne sont pas actifs.
    ils sont actifs dans l'objet a partir du moment ou DoModal est lancé..
    ni avant ni apres.
    voir mon post precedent avec le lien dans la faq ou j'interviens justement sur des controles d'une CFileDialog.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Oui, c'est vrai, mais avant de poster j'avais déjà essayé après le DoModal et ça plante aussi!!!!!


    En plus la boîte apparaît dès lors qu'on fait DoModal et on passe à la suite une fois qu'on a fait "Enregistrer" ou "Annuler" donc c'est pas possible que je doive changer le texte des contrôles après le DoModal.

    Conclusion : Au secours : 2 lignes de code pour me montrer comment faire ce que je veux s'il vous plait

  12. #12
    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
    le traitement est a faire dans OnInitDialogue qui est la fonction idoine.

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Euh... il n'y a pas de code OnInitDialog dans lequel je peux rentrer pour cette boîte standard...?

    Je sais bien pour mes boîtes que je m'occupe de toute la création graphique dans OnInitDialog mais là... :

  14. #14
    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
    il faut faire une classe dérivée de CFileDialog ....
    et intercepter OnInitDialog.

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    C'est ce que je craignais au vu de la FAQ; c'est un peu lourd en fin de compte de créer une nouvelle classe juste pour faire quelques petites modifications de texte d'un bouton et d'un texte static par exemple.

    S'il n'y a pas d'autre solution alors, fin du sujet (et je suis un peu déçu qu'on puisse changer par exemple un titre de fenêtre par dlg.m_pOFN->lpstrTitle="Nouveau titre"; mais rien pour le reste).

  16. #16
    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 stof
    C'est ce que je craignais au vu de la FAQ; c'est un peu lourd en fin de compte de créer une nouvelle classe juste pour faire quelques petites modifications de texte d'un bouton et d'un texte static par exemple.

    S'il n'y a pas d'autre solution alors, fin du sujet (et je suis un peu déçu qu'on puisse changer par exemple un titre de fenêtre par dlg.m_pOFN->lpstrTitle="Nouveau titre"; mais rien pour le reste).
    ça prend 1 minute avec classe wizard et dans ce cas precis te permets de reprendre le controle d'une boite de dialogue pre parametrée.
    je ne trouve pas que ce soit lourd ,mais normal dans ce context.

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    BOOL CMyFileDialog::OnInitDialog()
    {
    	CFileDialog::OnInitDialog();
     
    	GetDlgItem(1090)->SetWindowText("Mon nouveau texte");
     
    	return TRUE;  
    }

    Pas mieux : j'ai créé une classe CMyFileDialog dérivée de CFileDialog et sans le OnInitDialog, ça fonctionne pareil (juste pour dire que j'ai bien réussi à faire cette classe dérivée).

    Mais le problème qui m'intéresse n'est pas résolu pour autant : ça plante toujours!

  18. #18
    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
    post le code qui plante ...

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Ben c'est le GetDlgItem, l'objet de mon post en fait;

    J'avais récolté par Spy++ 00000442 alors j'en ai déduit qu'il fallait mettre 1090 (l'équivalent décimal de 442 en hexadécimal).

    Mais CWnd* pWnd = GetDlgItem(1090); renvoie un pWnd NULL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void CWnd::SetWindowText(LPCTSTR lpszString)
    {
    	ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));
     
    	if (m_pCtrlSite == NULL)
    		::SetWindowText(m_hWnd, lpszString);
    	else
    		m_pCtrlSite->SetWindowText(lpszString);
    }

  20. #20
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	CWnd* pWnd;
    	int i;
    	for (i=0; i<3000; i++)
    	{
    		pWnd = GetDlgItem(i);
    		if(pWnd)
    			AfxMessageBox("Tiens, en voilà un de bon!");
    	}
    Ben en fait y'a pas l'air d'avoir d'ID qui donne quoi que ce soit!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Gridview: Comment récupérer les valeurs des deux clés?
    Par Thomas_Laurent dans le forum ASP.NET
    Réponses: 1
    Dernier message: 02/02/2007, 14h54
  2. Réponses: 2
    Dernier message: 11/12/2006, 12h38
  3. Comment récupérer les icones des URL?
    Par Blo0d4x3 dans le forum Windows
    Réponses: 3
    Dernier message: 26/05/2006, 15h29
  4. ShellListView : comment récupérer les noms des fichiers?
    Par Lolo1988 dans le forum Composants VCL
    Réponses: 1
    Dernier message: 11/12/2005, 23h19
  5. Comment obtenir les Handles des boutons systèmes de Windows ?
    Par Desraux dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 22/12/2004, 22h20

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