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 :

Nouvelle fonction OnFileNew()


Sujet :

MFC

  1. #1
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 92
    Points : 49
    Points
    49
    Par défaut Nouvelle fonction OnFileNew()
    Bonjour,

    je travaille sur une application MFC en C++.
    Pour l'appli j'ai besoin de redéfinir une fonction CWinApp::OnFileNew() car celle qui est déclarée dans le fichier afxwin.h (définise dans appdlg.cpp) est protected et moi il 'en faut une public.

    J'ai donc déclarée dans afxwin.h en public

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    afx_msg void OnFileNew2();
    et défini dans appdlg.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void CWinApp::OnFileNew2()
    {
    	if (m_pDocManager != NULL)
    		m_pDocManager->OnFileNew2();
    }
    seulement lorsque je génère la solution j'ai le message suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Navigators error LNK2001: symbole externe non résolu "public: virtual void __thiscall CWinApp::OnFileNew2(void)" (?OnFileNew2@CWinApp@@UAEXXZ)
    quelqu'un peut il m'aider?

    Merci

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je ne crois pas que tu puisses modifier directement CWinApp...

    D'ailleurs, quel programme MFC utilise la classe CWinApp directement? Généralemeent, on manipule une classe qui hérite de CWinApp... (et là, je pense que tu peux redéclarer ladite fonction en public...)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  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 ,
    oh ouille ouille ,modifier les .h du compilateur ...
    quand visual te generes un projet il genere une classe d'application heritée de CWinApp.
    c'est cette classe qu'il faut modifier....

  4. #4
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 92
    Points : 49
    Points
    49
    Par défaut
    merci mais ou est ce qu'elle se met cette classe dérivée? car là je chercher je chercher mais je la vois pas !!

  5. #5
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 92
    Points : 49
    Points
    49
    Par défaut
    en fait c bon j'ai trouvé la classe ou je peut créer ma nouvelle fonction onfilenew().

    Le code de OnFileNew est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void CWinApp::OnFileNew()
    {
    	if (m_pDocManager != NULL)
    		m_pDocManager->OnFileNew();
    }
    dans appdlg.cpp.

    Seulement en partant de ce code, je n'arrive pas à faire une nouvelle fonction.

    quelqu'un saurait il coment la faire??

  6. #6
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 92
    Points : 49
    Points
    49
    Par défaut
    quelqu'un aurait il une idée pour créer une fonction OnFileNew public car elle est définit en protected dans la class CWinApp (fichier afxwin.h)?

    Merci de votre aide !

  7. #7
    Membre actif Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Points : 257
    Points
    257
    Par défaut
    Pour quoi declarer la fonction OnFileNew en public ?

    Etant donné que ta classe dérive de CWinApp, tu peux y accéder sans soucis
    et la dériver.

    Utilise le Class wizzard pour ajouter OnFileNew dans la liste des fonctions que tu surcharges de CWinApp.

  8. #8
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 92
    Points : 49
    Points
    49
    Par défaut
    La je comprends pas elle est ou la class wizzard??

  9. #9
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 92
    Points : 49
    Points
    49
    Par défaut
    en fait j'ai une class CNavigatorsApp déclarée de cette façon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class CNavigatorsApp : public CWinApp
    ensuite dans ma classe navigators, j'utilise un type CNavigatorsApp* et je fais un certain nombre de OnFileNew (ouverture de plusieurs navigateurs internet explorer).

    Le problème est que je veut donner la possibilité à l'utilisateur d'ouvrir encore un nouveau navigateur une fois ceux-ci ouvert. J'ai donc une boite de dialogue qui s'ouvre et demande l'adresse du navigateur.

    L'événement du bouton "OK" est alors programmé de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    HRESULT NewNavigatorDialogBox::OnButtonOK(IHTMLElement* /*pElement*/)
    {
    	CNavigatorsApp* nnav = new CNavigatorsApp;
    	nnav->OnFileNew();
     
    	OnOK();
    	return S_OK;  // retourne TRUE  sauf si vous avez défini le focus sur un contrôle
    }
    et là, à la compilation j'ai le message suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2248: 'CWinApp::OnFileNew' : impossible d'accéder à protected membre déclaré(e) dans la classe 'CWinApp'
    alors que le "certain nombre" de premiers appels marche très bien !!

    quelqu'un voit le pb?

  10. #10
    Membre actif Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Points : 257
    Points
    257
    Par défaut
    Effectivement, comme ceci, c'est pas autorisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    HRESULT NewNavigatorDialogBox::OnButtonOK(IHTMLElement* /*pElement*/)
    {
       CNavigatorsApp* nnav = new CNavigatorsApp;
       nnav->OnFileNew(); 
       ...
    }
    Puisque ton NewNAvigatorDialogBox n'est pas un héritier de CWinApp, tu ne peux pas invoquer OnFileNew comme ceci.

    Il te faut créer une fonction publique dans CNavigatorsApp qui sera en charge d'appeler OnFileNew de CWinApp.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CNavigatorsApp : public CWinApp
    {
    public : 
       virtual void InvokeFileNew() { OnFileNew(); }
    ...
    };
    et puis ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    HRESULT NewNavigatorDialogBox::OnButtonOK(IHTMLElement* /*pElement*/)
    {
       CNavigatorsApp* nnav = new CNavigatorsApp;
       nnav->InvokeFileNew(); 
       ...
    }
    Oki doki ?

  11. #11
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 92
    Points : 49
    Points
    49
    Par défaut
    oki doki merki merki !!!

Discussions similaires

  1. Création d'une nouvelle fonction Excel (VBA)
    Par alinehg dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 27/05/2008, 20h20
  2. Nouvelle fonction de download de fichier
    Par Bergkamp007 dans le forum SAP
    Réponses: 1
    Dernier message: 14/11/2007, 15h09
  3. Réponses: 4
    Dernier message: 30/08/2007, 15h42

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