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 :

fenêtre supplémentaire de type CScrollView dans un MDI


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 164
    Par défaut fenêtre supplémentaire de type CScrollView dans un MDI
    bonsoir, je rencontre un problème pour créer une seconde vue de type CSrollView dans une application MDI.
    Mon programme ouvre à la base une image qui est affichée dans un CSrollView et je souhaite associer une deuxième vue au document ouvert pour ensuite pouvoir dessiner dedans grace au DC (GetDC etc).
    J'ai pour cela suivi la méthode donnée dans la FAQ :
    http://cpp.developpez.com/faq/vc/?pa...OnSameDocument

    Le problème est que l'exemple donné ne fonctionne que pour une classe dérivant de CEditView (dans la création du second CMultiDocTemplate).
    Si la classe utilisée dérive de CScrollView ou même CView le programme plante totalement à la ligne de code suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     TheApp->m_pFirstTemplate->InitialUpdateFrame(pFrame,GetDocument());
    J'espère avoir été clair, en résumé : comment rattacher une seconde vue (dérivant de CScrollView) au document pour ensuite pouvoir dessiner dedans?

    merci d'avance pour vos suggestions!

  2. #2
    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,
    cette méthode fonctionne très bien , l'erreur est ailleurs (pas la méthode).
    Note que tu n'as simplement rajouté une deuxième vue MDI à l'application,
    ce post montrait comment rajouter une deuxième vue a un document existant.
    pour une vue indépendante voir ce post: http://cpp.developpez.com/faq/vc/?pa...ltiDocTemplate

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 164
    Par défaut
    Citation Envoyé par farscape Voir le message
    salut,
    cette méthode fonctionne très bien , l'erreur est ailleurs (pas la méthode).
    Note que tu n'as simplement rajouté une deuxième vue MDI à l'application,
    ce post montrait comment rajouter une deuxième vue a un document existant.
    pour une vue indépendante voir ce post: http://cpp.developpez.com/faq/vc/?pa...ltiDocTemplate
    bonsoir, je veux justement une nouvelle vue reliée a un document déjà ouvert (donc existant), ma première vue affiche l'image bmp, je veux qu'une seconde vue affiche son histogramme par exemple. Il ne s'agit donc pas d'ouvrir une vue sur un nouveau document.
    Comme je l'ai dit le code donné ne marche qu'avec une classe dérivant de CEditView (pour la nouvelle vue), avec une CScrollView il plante avec l'erreur suivante :
    Exception non gérée à 0x782ab46a (mfc80d.dll) dans diblook.exe*: 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00000020.
    à la ligne indiquée dans le premier post.
    Sauriez-vous d'où vient cette erreur et comment la résoudre?
    merci

  4. #4
    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
    le debugger est ton ami ...
    inspecte les valeurs , remonte la pile des appels jusqu'à ton code, tout porte a croire qu'un des pointeurs est mal initialisé , 0x20 c'est 32 en décimal soit ' ' un peut étrange comme adresse...
    et comme je l'ai dit je suis sûr de ma méthode, c'est ton implémentation qui cause problème.
    [edit]
    je rajoute que j'ai fait le test avec une cscrollview, pas de problèmes...
    [/edit]

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 164
    Par défaut
    après pas mal de tests je ne vois toujours pas d'erreur dans mon code, d'ailleurs il marche bien pour une deuxième vue dérivant d'un CEditView mais grosse plantage pour une CScrollView..

    Voici les parties de mon code qui s'y rapportent :

    ma classe CHistView (simple dérivée de CScrollView) qui est la classe de la 2eme vue que je veut afficher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #pragma once
    #include "afxext.h"
    class CHistView :
    	public CScrollView
    {
    public:
    	CHistView(void);
    public:
    	~CHistView(void);
    };
    la création de mes 2 templates dans le InitInstance de mon application (en les ayant déclaré dans le .h):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    m_pFirstTemplate= new CMultiDocTemplate(IDR_DIBTYPE,
                                            RUNTIME_CLASS(CDibDoc),
                                            RUNTIME_CLASS(CChildFrame),
                                            RUNTIME_CLASS(CDibView));
                                            AddDocTemplate(m_pFirstTemplate);
     
    // la fenêtre supplémentaire.
    m_pTwoDocTemplate=new CMultiDocTemplate(IDR_DIBTYPE,
                                            RUNTIME_CLASS(CDibDoc),
                                            RUNTIME_CLASS(CChildFrame), 
                                            RUNTIME_CLASS(CHistView));
    le lancement de la seconde fenêtre lors d'un clique sur un item du menu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CDibLookApp *TheApp=(CDibLookApp*)AfxGetApp();
        CFrameWnd * pFrame =TheApp->m_pTwoDocTemplate->CreateNewFrame(GetDocument(),GetParentFrame());
    	//pFrame->SetWindowPos(NULL,0,0,662,350,NULL);//taille de la fenêtre fille
        TheApp->m_pFirstTemplate->InitialUpdateFrame(pFrame,GetDocument());
    en utilisant le debugeur j'ai une idée plus précise de la ligne où ça plante, c'est dans le fichier winfrm.cpp à la ligne que j'ai mis en gras :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CView* CFrameWnd::GetActiveView() const
    {
    	ASSERT(m_pViewActive == NULL ||
    		m_pViewActive->IsKindOf(RUNTIME_CLASS(CView)));
    	return m_pViewActive;
    }
    je ne sais pas trop comment interprêter ça ...

    Je commence à désespérer de trouver cette foutu erreur,

    peut être pourriez-vous m'envoyer le squelette de votre application qui ouvre la seconde vue en CScrollView, je pourrais alors fouiller le code pour voir la petite différence

    merci

  6. #6
    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
    ton contexte d'exécution ne doit pas être correct..
    voici un exemple fait avec visual 6.0 , la deuxième fenêtre est ouverte dans OnInitialUpdate de la première.
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. [Débutant] Ouverture de la fenêtre de repertoire dans Form MDI
    Par djillali_l dans le forum VB.NET
    Réponses: 0
    Dernier message: 01/07/2015, 14h27
  2. Réponses: 7
    Dernier message: 13/03/2006, 08h56
  3. Réponses: 2
    Dernier message: 21/11/2005, 14h46
  4. [VB6] Position d'une MDIchild dans un MDI
    Par pepper dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 29/01/2003, 14h02
  5. Impression dans une MDI Application
    Par Andry dans le forum Composants VCL
    Réponses: 8
    Dernier message: 19/12/2002, 08h45

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