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] MDI, CMultiDocTemplate & cie.


Sujet :

MFC

  1. #1
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut [MFC] MDI, CMultiDocTemplate & cie.
    Bonjour à tous,

    je dois créer une fenêtre (frame) dans une appli de type vaguement MDI et, d'une part, c'est un de mes gros points faible, et d'autre part, cette appli est des plus complexes. J'aurais donc besoin de quelques éclaircissements, c'est pourquoi je me tourne vers vous.

    1/ Le CMultiDocTemplate. Le principe me semble pratique, mais le problème c'est que la fenêtre que je dois créer ne comporte pas de doc. Vous savez, pour créer un CMultiDocTemplate, il faut lui passer le nom des classes du doc, de la frame et de la view. Bon ben moi j'ai pas de doc, est-ce que cela peut poser problème? Comment fonctionne le mécanisme du CMultiDocTemplate? Ce que je ne comprends pas, c'est comment sont créés les views (où et comment doit-on faire le Create, etc.)?

    2/ La MDI. J'ai donc créé une frame et une view. Mais dans ma frame, je n'ai pas de methode d'initialisation (OnInitDialog, OnInitialUpdate ou ce genre de chose). Comment se fais-ce? Dois-je la créer "à la main"?

    3/ Le code. Pour l'instant, en tatonnant, j'ai réussi à compiler, mais j'ai un gros plantage sur le create de ma view. Je l'ai mis dans le Create de ma frame, mais j'ai la très désagréable impression que je fais fausse route. Pour info, voici le code qui pose problème:
    int CMyFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    [...]
    CRect rect;
    GetClientRect(rect);
    m_pView->CreateEx(0, "toto", "titi", WS_VISIBLE|WS_CHILD, rect, this, IDD_MY_VIEW, NULL);

    m_pView->ShowWindow(SW_SHOW); //Ca plante ici, avec m_pView->m_hWnd = 0xfeeefeee
    [...]
    Une idée?

  2. #2
    Membre émérite
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Par défaut
    Je crois bien que tu fasses fausse route.
    Les MFC t'offre déjà une autoroute bien asphalté et toi tu veux emprunter un sentier.
    Si ta fenêtre est sans document alors je ne vois aucun mal d'en créer un et de le connecter dans le CMultiDocTemplate.
    Tu crées simplement une classe document sans fonctionnalité apparente mais par pure formalité pour permettre aux MFC de créer correctement ta fenêtre.

  3. #3
    Membre émérite
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Par défaut
    En ce qui concerne l'initialisation, tu as le message WM_CREATE de ta frame si tu as à créer dynamiquement des objets (contrôles, etc) et tu as la méthode virtuelle OnInitialUpdate() de ta vue qui est le meilleur candidat où tu puisses initialiser tes données.

    Les MFC font appel à toutes une serie d'appels de fonctions dans le CMultiDocTemplate lors de la création jusqu'à l'affiche d'une fenêtre MDI
    En écrivant un code comme le tien tu ne manqueras pas de court circuiter les appels.

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Ok, merci Gabrielly

    apparamment, il n'est pas possible créer un MutiDocTemplate sans Doc. J'ai testé différentes approches, mais j'obtiens toujours des gros plantages hideux.

    Pour le reste, je commence à comprendre

  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
    Par défaut
    salut,
    tu peux utiliser la classe CDoc dans la déclaration de ton document template
    sans pour autant a avoir à gérer le document par la suite...

  6. #6
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    oui, c'est la solution qui m'a semblé la meilleure, en effet.
    Bon, je vais mettre résolu alors

  7. #7
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Erf, j'ai un petit souci:
    J'ai créé mon DocTemplate ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    m_pTotoDocTemplate = new CMultiDocTemplate(
            IDR_TOTO, //icone
            RUNTIME_CLASS(CDocument), //document dont je ne me sert pas
            RUNTIME_CLASS(CTotoFrame), // ma frame qui contient ma view
            RUNTIME_CLASS(CTotoView) );  // ma view AddDocTemplate(m_pTotoDocTemplate );
    Et ce qu'il se passe, c'est que ma frame est bien affichée, avec l'icone et tout, mais l'interieur de la frame, qui devrait afficher ma view, n'affiche rien du tout (le rect n'est pas rafraîchi, donc il m'affiche ce qu'il y a derrière la frame, et quand je déplace la frame, il ne rafraichi pas l'intérieur).

    Vous savez d'où ça peut venir?

  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
    Par défaut
    quelle est la classe de base de CTotoView ?

  9. #9
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    C'est une cdxCDynamicFormView (une classe récupérée sur codeproject qui hérite de CFormView)

  10. #10
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    C'est étrange, le constructeur de CTotoView n'est jamais appelé. Y aurait-il un souci avec le IMPLEMENT_DYNCREATE() ?

  11. #11
    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
    montre la ligne IMPLEMENT_DYNCREATE

  12. #12
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Bon ok, je te montre les bouts de code que j'estime importants:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //dans la mainframe:
    m_pTotoTemplate = new CMultiDocTemplate(
            IDR_BE,
            RUNTIME_CLASS(CDocument),
            RUNTIME_CLASS(CTotoFrame),
            RUNTIME_CLASS(CTotoView) );
        AddDocTemplate(m_pTotoTemplate );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //TotoView.h
    class CTotoView: public cdxCDynamicFormView
    {
     public:
        CTotoView(/*CWnd* pParent = NULL*/);
        ~CTotoView();
        DECLARE_DYNCREATE(CTotoView);
     
        //{{AFX_DATA(CTotoView)
            enum{ IDD = IDD_TOTO_FORM };
        //}}AFX_DATA
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //TotoView.cpp
    IMPLEMENT_DYNCREATE(CBEMainDialog, cdxCDynamicFormView)
     
    CBEMainDialog::CBEMainDialog(/*CWnd* pParent*/ /*=NULL*/)
        : cdxCDynamicFormView(IDD, fdAll,flAntiFlicker)
    {
    ///etc...
    Si je met un breakpoint sur le IMPLEMENT_DYNCREATE, je vois qu'il y passe lors de l'exécution, mais le constructeur n'est jamais appelé.

  13. #13
    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
    arf normal , tu me fais pas un petit melange entre une dialogue et une CFormview.?
    il n'y pas de parent dans le constructeur d'une CFormview ....
    ça serait plutot un truc comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CBEMainDialog::CBEMainDialog()
        : cdxCDynamicFormView(IDD, fdAll,flAntiFlicker)

  14. #14
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Oui en fait, le truc c'est que je suis parti d'une CDialog, mais je dois (pour plusieurs raisons qu'il serait fastidieux et inutile de développer(.com) ici) la transformer en cette satané DocTemplateMachin
    Bon du coup j'ai tout un tas de questions:
    1/ Je n'ai pas vu la différence, dans ton précédent post, entre mon code et le tien (j'ai mis le paramètre du constructeur en commentaire, c'est un reliquat de ma CDialog).
    2/ Je ne parviens pas à trouver des infos sur les DECLARE_DYNCREATE et IMPLEMENT_DYNCREATE. Que sont ces étranges animaux?
    3/ Pour que le constructeur de ma view soit appelé, il faut que ma classe soit "castable" en CView c'est ça?

  15. #15
    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
    j'avais pas vu que l'argument etait en commentaire..
    il faut un constructeur par defaut .
    DECLARE_DYNCREATE permet la gestion de la signature de la classe et donc l'utilisation de CreateObject pour la creation dynamique..
    si ça rentre pas dans ton constructeur je serais tenté de dire qu'il y a un chisme avec celui de la classe de base.
    pour faire un essai rapide remplace cette classe par CFormView pour voir ...
    tu as pensé à mettre child dans les proprietes de la fenetre ...

  16. #16
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Ayé, jâ réussi gnn... ça gnnn... marche!!
    Enfin, je pouvoir aller déjeuner

    En fait, le problème venait du fait que j'utilisais 2 méthodes différentes et apparemment antagonistes: j'utilisais d'une part un CMultiDocTemplate() et d'autre part un CreateNewChild(). Bref, comme d'habitude, je me suis un peu emmêlé les pinceaux



    Pour info, l'utilisation d'une cdxCDynamicFormView pour des fenêtres un peu complexes dans une MDI est vraiment pratique. Et puis le rendu est impeccable.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 16/05/2005, 17h43
  2. [MFC] - MDI : CDialogBar resize....
    Par Alice9 dans le forum MFC
    Réponses: 5
    Dernier message: 18/02/2005, 17h12
  3. Réponses: 12
    Dernier message: 15/02/2005, 15h34
  4. Réponses: 3
    Dernier message: 09/02/2005, 16h43
  5. Réponses: 12
    Dernier message: 02/02/2005, 16h52

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