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 :

[MFC] Insertion de Toolbar


Sujet :

MFC

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 47
    Par défaut [MFC] Insertion de Toolbar
    Bonsoir à tous,

    alors, je poste ce sujet, car je n'arrive pas à me dépatouiller avec une CToolBar, la MSDN, les FAQ, et les posts déja présents sur le forum...

    Alors, voila, je voudrais inserer une CToolBar dans mon appli MFC.

    Donc, j'ai créé une ToolBar, nommée IDR_TOOLBAR1 dans l'editeur de ressources de VS2005.

    Ensuite, dans mon OnInitDialog de mon appli, j'ai suivi ce qui était dit dans la MSDN, c'est à dire, ce code ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            CToolBar toolbar;
    	toolbar.Create(this,CBRS_TOP,IDD_FIRSNAKE_DIALOG);
    	toolbar.LoadToolBar(IDR_TOOLBAR1);
    Je n'ai pas d'erreur à ce niveau.

    Par contre, après compilation, lors du lancement de mon appli, pas de toolbar en vue...

    Ce qui me chagrine, c'est que je créé ma toolbar, mais je ne "l'incruste" pas dans ma fenetre, et je n'ai pas trouvé la methode pour...
    donc, quelqu'un pourrait-il m'expliquer le principe de mise en place des toolbars sous VS2005 utilisant MFC ??

    Merci,
    Sebpsi.

  2. #2
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Essaye de recopier scrupuleusement l'exemple de la FAQ (ici) pour après revenir à ce que toi tu veux, tu y arriveras sûrement mieux! Bon courage

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 47
    Par défaut
    alors, le probleme, c'est que si j'ai bien compris la FAQ, normalement on a une methode deja existante que s'appelle "OnCreate()". Or, pour mon appli qui s'appelle FIR-Snake, basée sur les MFC, ma classe mère s'appelle FIR-Snake.h, avec la création de la boite de dialogue dans la classe FIR-SnakeDlg.h...

    Or, dans cette classe mère, il n'existe aucune méthode OnCreate()...

    J'ai seulement la méthode InitInstance()... Et, ca ne fonctionne pas dans la méthode InitInstance()...

    Donc, je ne vois vraiment pas comment faire...

  4. #4
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Le OnCreate, c'est la méthode CWnd dans laquelle tu peux mettre les initialisations de ta boîte de dialogue, c'est une méthode à surcharger. Dans ta classe de dialogue, FIR-SnakeDlg, tu dois implémenter la OnInitDialog() et mettre tes initialisations (donc la création de ta toolbar) dedans.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 47
    Par défaut
    C'est donc bien ce que j'avais fait dans mon 1er message...

    La fonction donnée dans la FAQ permet juste d'avoir un TRACE en mode debug...

    Sinon, elle ne fait que creer la toolbar...

    Et si on regarde bien, j'avais ecrit a peu pres pareil, mais sans le TRACE...

    J'ai donc repris leurs parametres de creation de toolbar, en adaptant bien sur le nom de mon toolbar (IDR_TOOLBAR1), mais rien n'y fait...

    Je crois que l'on tourne en rond...

  6. #6
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Excuse-moi d'insister, mais si je vois bien l'exemple de la FAQ:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     ...
    if(!m_ToolBar.Create(this, WS_CHILD | WS_VISIBLE | CBRS_TOP) || !m_ToolBar.LoadToolBar(IDR_TOOLBAR))
    ...
    il y a des flags genre WS_VISIBLE que tu n'as plus par défaut si tu mets autre chose à la place (CBRS_TOP dans ton cas). Libre à toi de mettre autre chose que les valeurs par défaut pour le deuxième paramètre, mais il faut (je pense) au moins mettre le flag WS_VISIBLE non? Et peut-être même WS_CHILD. Je n'ai pas essayé, je ne te certifie pas que ça va marcher, mais quand je te disais de recopier scrupuleusement la FAQ, c'est justement pour voir l'influence de ce genre de modifications.
    Tiens-moi au courant.

  7. #7
    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
    Par défaut
    Citation Envoyé par sebpsi
    C'est donc bien ce que j'avais fait dans mon 1er message...

    La fonction donnée dans la FAQ permet juste d'avoir un TRACE en mode debug...

    Sinon, elle ne fait que creer la toolbar...

    Et si on regarde bien, j'avais ecrit a peu pres pareil, mais sans le TRACE...

    J'ai donc repris leurs parametres de creation de toolbar, en adaptant bien sur le nom de mon toolbar (IDR_TOOLBAR1), mais rien n'y fait...

    Je crois que l'on tourne en rond...
    salut,
    ton code ne risque pas de fonctionner,
    parce qu'il n'est pas positionné au bon endroit :
    il doit être dans la mainframe pour du SDI,et dans la mdichild pour du MDI.
    quand aux arguments tu es loin du compte ...
    tu devrais tenir compte des remarques et conseils de spoutspout...

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 47
    Par défaut
    bon, alors, il est vrai, et je l'ai admis que les parametres que j'avais mis dans mon 1er message n'etaient pas exacts.

    Par contre, j'ai bien dis dans mon 2eme message que j'avais recopié les paramètres de la FAQ.

    De plus, j'ai fait 2 essais:

    Le 1er, dans la méthode OnInitDialog() avec un copier-coller exact de la FAQ. Rien n'est apparu. Même pas ma fenetre.... ca m'a sorti une erreur de violation d'acces mémoire. voici le code que j'ai mis:

    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
    BOOL CFIRSnakeDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
     
    	// Ajouter l'élément de menu "À propos de..." au menu Système.
     
    	// IDM_ABOUTBOX doit se trouver dans la plage des commandes système.
    	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    	ASSERT(IDM_ABOUTBOX < 0xF000);
     
    	CMenu* pSysMenu = GetSystemMenu(FALSE);
    	if (pSysMenu != NULL)
    	{
    		CString strAboutMenu;
    		strAboutMenu.LoadString(IDS_ABOUTBOX);
    		if (!strAboutMenu.IsEmpty())
    		{
    			pSysMenu->AppendMenu(MF_SEPARATOR);
    			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    		}
    	}
     
    	if(CFIRSnakeDlg::OnInitDialog() == -1) return -1;
        // CToolBar  m_ToolBar;
        if(!m_ToolBar.Create(this, WS_CHILD | WS_VISIBLE | CBRS_TOP) || 
                                         !m_ToolBar.LoadToolBar(IDR_TOOLBAR1))
        {
            TRACE0("Failed to create toolbar\n");
            return -1;      // fail to create
        }
        return 0;
     
    	// Définir l'icône de cette boîte de dialogue. L'infrastructure effectue cela automatiquement
    	//  lorsque la fenêtre principale de l'application n'est pas une boîte de dialogue
    	SetIcon(m_hIcon, TRUE);			// Définir une grande icône
    	SetIcon(m_hIcon, FALSE);
     
    return TRUE;  // retourne TRUE, sauf si vous avez défini le focus sur un contrôle
    }
    Bien sur, ce rajout de code me semble bizarre, car ma fonction OnInitDialog renvoie un BOOL et non un int.

    Ensuite, j'ai essayé sans tout ces return, mais en laissant la condition:

    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
    BOOL CFIRSnakeDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
     
    	// Ajouter l'élément de menu "À propos de..." au menu Système.
     
    	// IDM_ABOUTBOX doit se trouver dans la plage des commandes système.
    	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    	ASSERT(IDM_ABOUTBOX < 0xF000);
     
    	CMenu* pSysMenu = GetSystemMenu(FALSE);
    	if (pSysMenu != NULL)
    	{
    		CString strAboutMenu;
    		strAboutMenu.LoadString(IDS_ABOUTBOX);
    		if (!strAboutMenu.IsEmpty())
    		{
    			pSysMenu->AppendMenu(MF_SEPARATOR);
    			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    		}
    	}
     
    	//if(CFIRSnakeDlg::OnInitDialog() == -1) return -1;
        // CToolBar  m_ToolBar;
        if(!m_ToolBar.Create(this, WS_CHILD | WS_VISIBLE | CBRS_TOP) || 
                                         !m_ToolBar.LoadToolBar(IDR_TOOLBAR1))
        {
            TRACE0("Failed to create toolbar\n");
            //return -1;      // fail to create
        }
        //return 0;
     
    	// Définir l'icône de cette boîte de dialogue. L'infrastructure effectue cela automatiquement
    	//  lorsque la fenêtre principale de l'application n'est pas une boîte de dialogue
    	SetIcon(m_hIcon, TRUE);			// Définir une grande icône
    	SetIcon(m_hIcon, FALSE);
     
    return TRUE;  // retourne TRUE, sauf si vous avez défini le focus sur un contrôle
    }
    Et la, mon code se génère sans problemes, mais ma ToolBar n'apparait pas...

    Alors, si je vous ai bien suivi, j'ai initialisé ma ToolBar dans OnInitDialog(), ce que vous m'aviez dit, j'ai scrupuleusement recopié la FAQ, mais ca ne fonctionne pas...

    PS: j'ai bien sur créé ma ToolBar dans le fichier .h comme attribut Protected.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 47
    Par défaut
    Citation Envoyé par farscape
    salut,
    ton code ne risque pas de fonctionner,
    parce qu'il n'est pas positionné au bon endroit :
    il doit être dans la mainframe pour du SDI,et dans la mdichild pour du MDI.
    quand aux arguments tu es loin du compte ...
    tu devrais tenir compte des remarques et conseils de spoutspout...
    Qu'entends tu par mdichild concretement ??

    Pcq, j'ai les bases de la prog (l'algorithmie), mais je debute en C++, et particulierement en MFC.... Donc, SDI, MDI, ca ne me parle pas trop...

    Si tu pouvais m'expliquer, en prenant un projet fictif, qui est la mdichild, etc....


    merci...

  10. #10
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    MDI c'est pour Multiple Document Interface et SDI c'est pour Single Document Interface. En gros, soit t'as plusieurs fenêtres, soit une seule.
    Dans le OnInitDialog (cas d'un CDialog) ou de le OnCreate() (cas d'une frame), si tu recopies exactement l'exemple de la FAQ, tu n'auras normalement pas de problème. Si ça ne marche toujours pas, alors ton problème ne vient pas de là.
    Bon courage

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/06/2007, 15h13
  2. [MFC] Insertion d'une chaine de caractère dans une BD
    Par julien.nasser dans le forum MFC
    Réponses: 2
    Dernier message: 20/04/2006, 15h19
  3. [MFC] Redimensionnement de ToolBar
    Par windsurfeur44 dans le forum MFC
    Réponses: 7
    Dernier message: 15/09/2004, 19h43
  4. [MFC][Toolbar] Aligner les toolbars
    Par 6psyk9 dans le forum MFC
    Réponses: 3
    Dernier message: 17/05/2004, 21h58

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