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 :

Création une vue manuellement et surtout correctement


Sujet :

MFC

  1. #1
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut Création une vue manuellement et surtout correctement
    Salut,

    J'ai un problème lors de la création manuelle d'une classe dérivée de CFormView.

    Dans mon programme, je récupère un objet de type CRuntimeClass. Je veux créer la vue à partir de cet objet. Je fait donc ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CMyFormView * pView = (CMyFormView *)pRuntimeClass->CreateObject ( );
    Mais après exécuter ça, le pointeur est correct mais je n'ai pas de m_hWnd.
    Donc bon, je ne suis pas très contrariant de si bon matin, alors je tentes de faire un Create
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    pView = (CMyFormView *)m_pRuntimeClass->CreateObject ( );
    DWORD dwStyle = AFX_WS_DEFAULT_VIEW;
    CRect rect(0,0,300,300);
    pView->Create(NULL, NULL, dwStyle, rect, this, AFX_IDW_PANE_FIRST+1);
    Mais quand je compile, il me dit que le Create ne prend pas 6 paramètres. Alors que dans la doc, le CWnd::Create en prend 7 dans le dernier avec une valeur par défaut. Donc 6.

    Donc maintenant, je suis complètement perdu de chez perdu. Je ne sais plus quoi faire pour créer correctement cette Vue et avec un m_hWnd correct.

    Auriez vous une idée ?

    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,
    La question c’est pourquoi tu fais ça ?
    Pourquoi ne pas passer par un doctemplate qui sait faire le boulot par OpenDocumentFile ?

  3. #3
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut
    On fait je suis dans une application MDI.
    Chaque MDI est séparé par un Splitter. Quand je clique sur l'arbre de droite, j'affiche à droite tous les fils de la branche de l'arbre sélectionnée.

    J'ai donc à droite une CFormView avec entre autre une CListCtrl.

    Mais certains éléments de l'arbre ne doivent pas afficher cette liste dans la partie de droite. Ils doivent afficher une vue particulière.

    Donc mon but est de créer les vues spécifiées à ce élément particulier et de l'ajouter au document pour l'activer ensuite.

    Voilà !!!

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    ok je comprends mieux:
    tiens j'ai bricolé une fonction qui devrait faire l'affaire:
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    CView * CreateDynamicView(CRuntimeClass *pRuntimeView,
    											  CDocument *pDocument,
    											  CWnd * pParentWnd,
    											  CFrameWnd* pParentFrame,
    											  CRect viewRect,
    											  UINT nIdView/*=1000*/,
      										  	  BOOL bBorder/*=FALSE*/,
    											  BOOL bShow/*=TRUE*/)
    {		 
    	CView* pView = reinterpret_cast<CView*>(pRuntimeView->CreateObject());
        ASSERT(pView != NULL);
     
      	CCreateContext context;
       	context.m_pNewViewClass		= pRuntimeView;
       	context.m_pCurrentDoc		= pDocument;
       	context.m_pNewDocTemplate	= NULL;
       	context.m_pLastView			= NULL;
       	context.m_pCurrentFrame		= pParentFrame;
     
     
        if(!pView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,viewRect,
    		 pParentWnd, nIdView, &context))
    	{
       	   	TRACE0 ("System Error - Unable to create form view\n");
    	   	return NULL;	  
    	}
     
    	if(bShow)
    	{
    		pView->SetWindowPos(NULL, 0, 0, 0, 0,
    		                    SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE);
    		pParentFrame->SetActiveView(pView);
    	}
    	else
    		pView->SetWindowPos(NULL, 0, 0, 0, 0,
    		                    SWP_HIDEWINDOW|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE);
     
    	long style = ::GetWindowLong(pView->GetSafeHwnd(), GWL_STYLE);
    	if(!bBorder)
    		style &= ~WS_BORDER;
    	else
    		style |= WS_BORDER;
    	::SetWindowLong(pView->GetSafeHwnd(), GWL_STYLE, style);
     
    	pView->OnInitialUpdate();
    	return pView;
    }

  5. #5
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut
    Ok je prend et je te tiens au courant.
    En tout cas merci

  6. #6
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut
    C'est cool, c'est bon. Ca marche, il faut juste que je fasses les bon ajustement dans mon programme pour que tout fonctionne parfaitement.

    Par contre, j'ai juste une question :
    En fait, j'ai mis le "pParentWnd" comme étant le Splitter. Est-ce correct, pour que la nouvelle vue appartienne bien au splitter ? Je penses mais j'ai juste un doute.

    En tout cas merci bien

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    Citation Envoyé par vanitom
    C'est cool, c'est bon. Ca marche, il faut juste que je fasses les bon ajustement dans mon programme pour que tout fonctionne parfaitement.

    Par contre, j'ai juste une question :
    En fait, j'ai mis le "pParentWnd" comme étant le Splitter. Est-ce correct, pour que la nouvelle vue appartienne bien au splitter ? Je penses mais j'ai juste un doute.

    En tout cas merci bien
    oui c'est correct ,c'est le traitement du splitter sur la creation d'une view.(CreateView). le parent est bien le splitter.


  8. #8
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut
    La vue est correctement ajouter à la frame mais par contre le comportement du Splitter est modifier.
    En fait maintenant quand j'utilise la barre de séparation, les nouvelles vues créées ne réagisent plus. Elles ne déclenche plus leurs fonctions OnSize.

    Donc j'ai décidé d'essayé un autre truc. Et j'y suis presque mais il me manque juste un truc.
    Je tentes d'utiliser toutes les méthodes fournie avec le Splitter.

    En fait, j'essaye de detruire la vue se trouvant à droite pour en recréer une nouvelle. Et c'est bon le code le fait bien. Il initialise la nouvelle vue et tout le top, quoi.
    Mais par contre, il positionne cette pu****n de vue au point X=0, et Y=0 de la frame. Donc sur la partie de gauche.
    J'ai donc les deux vues qui se superpose. Les boules.
    Mais le pire, c'est que quand je redimenssionne la fenêtre, la nouvelle vue se replace bien ou il faut.
    Je ne sais pas d'ou vient le problème. Et surtout comment le résoudre.

    Mais par contre, le déplacement du split fonctionne correctement maintenant.

    J'ai tenté un truc mais ça ne marche pas.
    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
    CRect rect;
    CDocument * pDoc   = pFrame->GetActiveDocument ( );
    CSplitterWnd * pSplitter = (CSplitterWnd *)pWnd->GetParent ( );
    CView * pOldView = (CView *)pSplitter->GetPane ( 0, 1 );
     
    pOldView->GetWindowRect ( &rect );
    pSplitter->ScreenToClient ( &rect );
     
    CCreateContext context;
    context.m_pNewViewClass = m_pMyRTClass;
    context.m_pCurrentDoc = pDoc;
    context.m_pNewDocTemplate = NULL;
    context.m_pLastView = pOldView;
    context.m_pCurrentFrame = pFrame; 
     
    pSplitter->DeleteView ( 0, 1 );
    pSplitter->CreateView ( 0, 1, m_pMyRTClass, CSize ( rect.Width ( ), rect.Height ( ) ), &context );
     
    pView = (CMyFormView *)pSplitter->GetPane ( 0, 1 );
    pView->OnInitialUpdate();
    Il doit me manque un truc. Mais là, mystère. Car dans le CreateView, je ne donne que la taille et pas l'origine.

    Une idée

  9. #9
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut
    En fait, c'est pas très compliqué.
    Quand on exécute le CreateView, il pose la vue au point 0, 0. Il ne cherche pas a comprendre.

    J'ai donc fais un SetWindowPos sur la vue. Et c'est bon.

    Voici le nouveau 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
    CRect rect;
    CDocument * pDoc   = pFrame->GetActiveDocument ( );
    CSplitterWnd * pSplitter = (CSplitterWnd *)pWnd->GetParent ( );
    CView * pOldView = (CView *)pSplitter->GetPane ( 0, 1 );
     
    pOldView->GetWindowRect ( &rect );
    pSplitter->ScreenToClient ( &rect );
     
    CCreateContext context;
    context.m_pNewViewClass = m_pMyRTClass;
    context.m_pCurrentDoc = pDoc;
    context.m_pNewDocTemplate = NULL;
    context.m_pLastView = pOldView;
    context.m_pCurrentFrame = pFrame;
     
    pSplitter->DeleteView ( 0, 1 );
    pSplitter->CreateView ( 0, 1, m_pMyRTClass, CSize ( rect.Width ( ), rect.Height ( ) ), &context );
     
    pView = (CMyFormView *)pSplitter->GetPane ( 0, 1 );
    pView->SetWindowPos ( NULL, rect.left, rect.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE );
    pView->OnInitialUpdate();

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

Discussions similaires

  1. création d'une vue ...help
    Par menoce dans le forum Langage SQL
    Réponses: 3
    Dernier message: 06/07/2005, 21h30
  2. Réponses: 26
    Dernier message: 27/04/2005, 11h29
  3. Création d'une vue
    Par Xris dans le forum Langage SQL
    Réponses: 6
    Dernier message: 29/01/2005, 16h30
  4. Réponses: 7
    Dernier message: 12/07/2004, 22h30
  5. [Plugin] Création d'une vue dynamiquement
    Par The Bonze dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 15/06/2004, 13h23

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