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] Pb de création d'une vue dans une application Doc/Vue


Sujet :

MFC

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 14
    Points : 4
    Points
    4
    Par défaut [MFC] Pb de création d'une vue dans une application Doc/Vue
    Bonjour !!!

    Je souhaite pouvoir changer la vue de mon application.
    Pour cela j'ai crée une ressource de type DIALOG que j'ai associé à une classe CMyFormView dérivant de CFormView.

    Création de la vue à partir du menu de CMainFrame

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void CMainFrame::OnNewView() 
    {
        	CMyFormView* m_pNewView= new CMyFormView; 
     
            m_pNewView->Create(NULL, NULL,
                                             WS_OVERLAPPED/*WS_BORDER*/,
                                             CFrameWnd::rectDefault, 
                                             this, 1, NULL);
     
    }
    J'ai redéfini la méthode Create dans ma classe CMyFormView car la méthode Create de la classe de base CFormView est "Protected" donc non accessible depuis la classe CMainFrame.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    BOOL CMyFormView ::Create(LPCTSTR a, LPCTSTR b, DWORD c,
                               const RECT& d, CWnd* e, UINT f, CCreateContext* g)
    {	
    	BOOL bresult= Create(a,b,c,d,e,f,g); 
     
    	return(bresult);
    }
    J'ai un gros plantage a l'appel de cette méthode Create.

    Quel est le problème ??????????

    Merci d'avance

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,

    BOOL CMyFormView ::Create(LPCTSTR a, LPCTSTR b, DWORD c,
    const RECT& d, CWnd* e, UINT f, CCreateContext* g)
    {
    BOOL bresult= Create(a,b,c,d,e,f,g);

    return(bresult);
    }
    1) des variables a,b,c,d,e,f,g mais quelle horreur !!!! on est plus en basic d'il y a 20 ans super pour la maintenance et pour comprendre quelque chose.
    2) dead lock tu connais ?
    tu te rappels toi même Create rappel Create etc....
    Donc ça explose au bout d'un certain temps.
    3) pourquoi redefinir Create ? il suffit de l'appeler
    ton projet c'est du SDI ?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Merci pour ta réponse.
    Pour les variables ne t'inquites pas c'etait un exemple.

    Je rédéfinis Create car la méthode Create de la classe CFormView n'est pas accessible depuis CMainFrame puisque Create est protégé.

    (CFormView*) Create(....);

    Mon projet est bien du SDI.

  4. #4
    Membre habitué
    Inscrit en
    Avril 2002
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 180
    Points : 157
    Points
    157
    Par défaut
    en effait CFormView::Create est Proteger tu doit passer par la RUNTIMECLASS pour afficher ta vue

    voici le code que j'utilisse Pour basculer entre diferente vue
    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
     
    void CMainFrame::SwitchView(CRuntimeClass *pViewClass)
    {
    	CCreateContext context;
    	BOOL set_active;
     
    	CDocument *doc =((CView*)GetActiveView())->GetDocument();
    	CView* active_view=GetActiveView();
     
    	if(active_view==NULL || active_view==GetActiveView())
    		set_active=TRUE;
     
    	else
    		set_active=FALSE;
     
    	doc->m_bAutoDelete=FALSE;
     
    	((CView*)GetActiveView())->DestroyWindow();
    	doc->m_bAutoDelete=TRUE;
     
    	context.m_pNewViewClass		=pViewClass;
    	context.m_pCurrentDoc		=doc;
    	context.m_pNewDocTemplate	=NULL;
    	context.m_pLastView			=NULL;
    	context.m_pCurrentFrame		=NULL;
     
    	CView* new_view=(CView*)CreateView(&context);
     
    	if(set_active==TRUE)
    		SetActiveView(new_view);
     
    	GetActiveView()->OnInitialUpdate();
    	RecalcLayout();
    	this->ShowWindow(SW_MINIMIZE);
    	this->ShowWindow(SW_MAXIMIZE);
     
    	GetActiveView()->SendMessage(WM_PAINT);
    	RecalcLayout();
    }
    puis tu appelle ta vue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ((CMainFrame*)AfxGetMainWnd())->SwitchView(RUNTIME_CLASS(/*Mon Form View*/));
    il y a un autre exemple dans la FAC

    Bon Courage

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup

    Ja vais essayer

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    J'ai essayé ta solution et d'autres : toujours le meme resultat sa plante sur la méthode create dans le fichier "viewform.cpp ligne 69 dont voici le code.

    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
     
     
    BOOL CFormView::Create(LPCTSTR /*lpszClassName*/, LPCTSTR /*lpszWindowName*/,
    	DWORD dwRequestedStyle, const RECT& rect, CWnd* pParentWnd, UINT nID,
    	CCreateContext* pContext)
    {
    	ASSERT(pParentWnd != NULL);
    	ASSERT(m_lpszTemplateName != NULL);
     
    	m_pCreateContext = pContext;    // save state for later OnCreate
     
    #ifdef _DEBUG
    	// dialog template must exist and be invisible with WS_CHILD set
    	if (!_AfxCheckDialogTemplate(m_lpszTemplateName, TRUE))   // <----- CA PLANTE ICI !!!!!
    	{
    		ASSERT(FALSE);          
    		PostNcDestroy();        
    		return FALSE;
    	}
    #endif //_DEBUG
     
    	// initialize common controls
    	VERIFY(AfxDeferRegisterClass(AFX_WNDCOMMCTLS_REG));
    	AfxDeferRegisterClass(AFX_WNDCOMMCTLSNEW_REG);

    si qq un peut m'aider !

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    J'ai fait de nouveaux essais à partir de ton code.

    Ca fonctionne si ma classe CMyFormView dérive de CView et ca ne fonctionne pas si ma classe dérive de CFormView.

    Si quelqu'un peut m'expliquer pourquoi je suis preneur.

    Merci.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    J'utilise donc le code qui m'a ete précedemment donné.

    La vue initiale disparait et semble être remplacée par ma vue CMyFormView mais celle ci apparait sans ces controles et avec un fond blanc.

    Pq ?

    Merci

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

Discussions similaires

  1. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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