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 :

[VC2005] Créer une fenetre et sa vue


Sujet :

MFC

  1. #1
    Membre confirmé Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Par défaut [VC2005] Créer une fenetre et sa vue
    Bonjour à tous,

    je sais créer une fenetre à partir de rien avec:

    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
     
    // CVisualisationLoi frame
     
    class CVisualisationLoi : public CFrameWnd
    {
    	DECLARE_DYNCREATE(CVisualisationLoi)
    public:
    	CVisualisationLoi(); 
    	// protected constructor used by dynamic creation
    	virtual ~CVisualisationLoi();
     
    protected:
    	DECLARE_MESSAGE_MAP()
    public:
    	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
     
    	};
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    VisuLoi=new CVisualisationLoi;
     
    VisuLoi->CreateEx(WS_EX_OVERLAPPEDWINDOW ,AfxRegisterWndClass( CS_OWNDC,0,0,  0),
    				  Ligne,WS_OVERLAPPEDWINDOW,rectangle,
    				  AfxGetMainWnd(),0,NULL);
     
     
    VisuLoi->SetIcon( ::LoadIcon(AfxGetInstanceHandle( ),MAKEINTRESOURCE(IDI_ICONE_GAVROCHE)),FALSE);
     
    VisuLoi->ShowWindow(SW_SHOW);
    J'ai une classe CVisualisationLoiVue, héritée de CView, dans le but de gérer l'affichage de ma fenetre.

    Comment associer l'une à l'autre ?

  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,
    je ne comprends pas ta question ...
    Comment associer l'une à l'autre ?
    l'autre c'est quoi ?

  3. #3
    Membre confirmé Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Par défaut


    l'une c'est ma fenetre (de type CFrameWnd mais on peux négocier ) et l'autre c'est ma vue (de classe perso CVuePerso imposée)

    autrement dit, comment dire à ma fenetre que son affichage est géré par ma classe CVuePerso et non par une classe CView générique ?

    Faut-il déclarer un CDocTemplate pour ça ?

  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
    ton projet est MDI ?

  5. #5
    Membre confirmé Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Par défaut
    non, pas MDI :
    j'ai une fenetre principale, son menu : un clic affiche une boite de dialogue.
    Un de ses boutons appelle la création d'une fenetre popup :
    c'est celle-ci qui est l'objet de ma question : sa vue est de type imposé (CVuePerso)

  6. #6
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    salut,

    tu créées ta vue en tant que fenetre enfant de la CFrameWnd avec comme ID : AFX_IDW_PANE_FIRST.

    c'est important pour l'ID sinon le RecalcLayout() de ta CFrameWnd ne positionnera pas la vue automatiquement.

    le code de création de la vue doit se trouver dans CFrameWnd::OnCreateClient(...) que tu auras substitué.

    @+

  7. #7
    Membre confirmé Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Par défaut
    tu créées ta vue en tant que fenetre enfant de la CFrameWnd avec comme ID : AFX_IDW_PANE_FIRST.

    pourrais-tu me dire comment créer la vue comme tu le dis ?
    merci d'avance

  8. #8
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    ta vue est une dérivée de CView ou de CWnd ?

  9. #9
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    moi je créerai la frame plutot comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CCreateContext context;
    context.m_pNewViewClass=RUNTIME_CLASS(CMaVuePerso);
     
    CFrameWnd *pFrameWnd=new CFrameWnd;
    if (!pFrameWnd->LoadFrame(IDR_MAFRAMEWND,WS_OVERLAPPEDWINDOW,NULL,&context))
    {
      AfxMessageBox(_T("erreur !"));
    }
    normalement ça créé ta vue automatiquement, à condition qu'elle dérive d'une CView.

    La fonction LoadFrame() recherche dans les resources, avec l'ID IDR_MAFRAMEWND :

    * une icone
    * une string pour le titre
    * un menu
    * les accélérateurs

    @+

  10. #10
    Membre confirmé Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Par défaut
    je progresse grace à toi, mais ...

    pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    maVue=(CMaVuePerso*)pFrameWnd->GetActiveView( );
    me donne-t-il NULL, signifiant que la fenètre n'a pas de Vue active ?

  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
    le fait que tu travailles en SDI est un choix imposé ?
    parce que ça serait vraiment plus simple en MDI...

  12. #12
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    SetActiveView est positionné comme ça dans InitialUpdateFrame:


    extrait des MFC:
    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
     
    void CFrameWnd::InitialUpdateFrame(CDocument* pDoc, BOOL bMakeVisible)
    {
    	// if the frame does not have an active view, set to first pane
    	CView* pView = NULL;
    	if (GetActiveView() == NULL)
    	{
    		CWnd* pWnd = GetDescendantWindow(AFX_IDW_PANE_FIRST, TRUE);
    		if (pWnd != NULL && pWnd->IsKindOf(RUNTIME_CLASS(CView)))
    		{
    			pView = (CView*)pWnd;
    			SetActiveView(pView, FALSE);
    		}
    	}
     
    	if (bMakeVisible)
    	{
    		// send initial update to all views (and other controls) in the frame
    		SendMessageToDescendants(WM_INITIALUPDATE, 0, 0, TRUE, TRUE);
     
    		// give view a chance to save the focus (CFormView needs this)
    		if (pView != NULL)
    			pView->OnActivateFrame(WA_INACTIVE, this);
     
    		// finally, activate the frame
    		// (send the default show command unless the main desktop window)
    		int nCmdShow = -1;      // default
    		CWinApp* pApp = AfxGetApp();
    		if (pApp != NULL && pApp->m_pMainWnd == this)
    		{
    			nCmdShow = pApp->m_nCmdShow; // use the parameter from WinMain
    			pApp->m_nCmdShow = -1; // set to default after first time
    		}
    		ActivateFrame(nCmdShow);
    		if (pView != NULL)
    			pView->OnActivateView(TRUE, pView, pView);
    	}
     
    	// update frame counts and frame title (may already have been visible)
    	if (pDoc != NULL)
    		pDoc->UpdateFrameCounts();
    	OnUpdateFrameTitle(TRUE);
    }
    J'ai oublié de te dire avant qu'il fallait appelé explicitement cette fonction ...
    C'est important si tu veux que la méthode 'OnInitialUpdate' de ta vue soit appelée.

    @+

  13. #13
    Membre confirmé Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Par défaut

    j'ai bien fait de te demander, je n'y serai jamais arrivé seul aussi rapidement
    Merci

    Pour répondre à Farscape, en effet, je suis parti en SDI sur mon projet car il était modeste. Maintenant qu'il grossit de mois en mois, je devrais passer en MDI (j'ai chargé ton tuto en plus ....
    Merci à toi également

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

Discussions similaires

  1. WPF : Problème pour créer une fenetre parent/enfant simple
    Par Ranx62 dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 01/04/2008, 02h39
  2. Créer une fenetre avec CreateWindow dans une DLL
    Par fx007 dans le forum Windows
    Réponses: 6
    Dernier message: 06/07/2007, 12h31
  3. créer une fenetre d'aide
    Par melie dans le forum Qt
    Réponses: 22
    Dernier message: 05/01/2007, 18h19
  4. créer une fenetre pour accéder a une page en laissant son mail
    Par binouzman dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 03/07/2006, 08h36
  5. Créer une fenetre d'options
    Par binouche22 dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 28/03/2005, 10h12

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