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 :

Utilisation des CPropertySheet


Sujet :

MFC

  1. #1
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Par défaut Utilisation des CPropertySheet
    Bonsoir,

    Je souhaietrais utiliser une CPropertySheet afin de pouvoir afficher deux onglets.
    Pour cela, dans ma classe CInterface (héritée de CWinApp), je créé une CMainFrame (hérité de CFrameWnd). J'ai redéfini dans CMainFrame la méthode OnViewPropertysheet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	psheet = new MySheet(); // psheet est de type MySheet, une classe héritée de CPropertySheet
    	psheet->Create(this, WS_CHILD|WS_VISIBLE, WS_CHILD|WS_VISIBLE);
    	dw = new CDW(); // dw et contexte sont de type CDW, une classe héritée de CPropertyPage
    	contexte = new CDW();
    	psheet->AddPage(dw);
    	psheet->AddPage(contexte);
    	psheet->DoModal();

    MySheet.h:
    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
    #ifndef MYSHEET_H
    #define MYSHEET_H
    #include "StdAfx.h"
     
    class MySheet : public CPropertySheet
    {
    public:
    	MySheet();
    	MySheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage);
     
    	~MySheet();
     
    	virtual BOOL OnInitDialog();
     
    protected:
    	DECLARE_MESSAGE_MAP();
     
    };
     
    #endif
    MySheet.cpp
    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
    #include "MySheet.h"
     
    BEGIN_MESSAGE_MAP(MySheet, CPropertySheet)
        //{{AFX_MSG_MAP(MySheet)
        //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
     
    MySheet::MySheet()
    :CPropertySheet()
    {
    }
     
    MySheet::MySheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
    :CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
    {
    }
     
    MySheet::~MySheet()
    {
    }
     
    BOOL MySheet::OnInitDialog()
    {
    	CPropertySheet::OnInitDialog();
    	return TRUE;
    }
    CDW.h
    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
    #include "StdAfx.h"
    #include <vector>
     
    using namespace std;
    typedef CEdit * MyCEdit;
     
    // Déclaration de la classe CDW_H 
    //--------------------------------------------------------- 
    class CDW : public CPropertyPage 
    { 
    public:
    	CDW();
     
    	~CDW();
    protected:
    	    DECLARE_MESSAGE_MAP();
     
    };
     
    #endif
    CDW.cpp
    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
    #include "CDW.h"
     
     
    BEGIN_MESSAGE_MAP(CDW, CPropertyPage)
        //{{AFX_MSG_MAP(CDW)
        //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
     
     
    CDW::CDW()
    	:CPropertyPage()
    {
    }
     
    CDW::~CDW()
    {
    }
    Malheureusement, lorsque j'execute mon code, j'obtiens une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception non gérée à 0x76a0b09e dans DataMiner.exe : Exception Microsoft C++ : CResourceException à l'emplacement mémoire 0x0012fe34..

  2. #2
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 526
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 526
    Par défaut
    psheet = new MySheet(); // psheet est de type MySheet, une classe héritée de CPropertySheet
    psheet->Create(this, WS_CHILD|WS_VISIBLE, WS_CHILD|WS_VISIBLE);
    psheet==NULL ? et que vaut this ?

  3. #3
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Par défaut
    Dans le doute je viens de rajouter un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	ASSERT(psheet == NULL);
    	MessageBox(_T("Test"));
    , il me leve bien le messagebox.
    this représente le CMainFrame dans lequel je souhaite creer ma propertysheet.

    Merci d'essayer de m'aider

  4. #4
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Par défaut
    Arf, dans le doute je viens de remplacer le code de CMainFrame::OnViewPropertysheet() par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	CPropertySheet s;
    	CPropertyPage page1;
    	CPropertyPage page2;
     
    	s.Create(this, WS_CHILD|WS_VISIBLE, WS_CHILD|WS_VISIBLE);
    	s.AddPage(&page1);
    	s.AddPage(&page2);
    	s.DoModal();
    Et ca plante toujours ...
    Il semblerait donc que je n'ai pas compris le fonctionnement des CPropertySheet
    Une âme généreuse pour tenter de m'expliquer ?

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 32
    Par défaut
    je crois me souvenir qu'il faut d'abord faire les addpage et seulement ensuite le create du propertysheet

  6. #6
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Par défaut
    J'ai modifié mon code pour le create se fasse après :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	CPropertySheet s;
    	CPropertyPage page1;
    	CPropertyPage page2;
     
    	s.AddPage(&page1);
    	s.AddPage(&page2);
    	MessageBox(_T("Test"));
    	s.Create(this, WS_CHILD|WS_VISIBLE, WS_CHILD|WS_VISIBLE);
    	MessageBox(_T("Test"));
    	s.DoModal();
    Mais ca plante toujours. J'ai mon premier messagebox, mais pas le deuxième : il semblerait donc que mon Create ne soit pas valide. Pour rappel, 'this' représente ma classe CMainFrame, héritée de CFrameWnd. Quelqu'un aurait une idée de la bétise qui doit trainer dans un coin de mon code ?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 32
    Par défaut
    Le 3éme paramètre WS_CHILD|WS_VISIBLE ne sert à rien la fonction Create attend à cet endroit des ExtendedStyle WS_EX_

    J'ai fait un test avec un projet CDialog based il y a 2 points ton Create doit être : s.Create(this, WS_VISIBLE); voire même s.Create(this); ou encore s.Create(); qui sont équivalents ce Create suffit à afficher le CPropertySheet. Le s.DoModal() ne doit pas être appelé sinon assertion. Le problème c'est que ta CPropertySheet n'est pas modal, pour cela il faudrai que tu l'inclut dans une CDialog et que tu appelle la CDialog avec DoModal(), si tu tient à ce point.

    Refait le test avec ton application MDI/SDI

    A+

  8. #8
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Par défaut
    Excuses moi, mais qu'est-ce qu'un "projet CDialog based " ? Et comment puis je faire le lien entre ma CFrameWnd, le CDialog et la CPropertySheet ?

    En tout cas merci de m'accorder du temps.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 32
    Par défaut
    Pour vérifier certains points j'ai créé un nouveau projet Dialog based avec le wizard (VC6), c'est à dire un projet boite de dialogue alors que ton projet semble être de type SDI ou MDI (Simple Document Interface, Multiple Document Interface).
    Cela ne devrait rien changer pour toi si ce n'est que ta propertysheet ne sera pas modal elle sera modeless. Si tu tiens absolument à avoir quelques chose de Modal il faut que tu crées une boite de Dialog (dérivée de CDialog) qui à pour child le CPropertySheet. Avant d'aller plus loin vois si le fonctionnement proposer te convient, ou si il y a d'autres problèmes.

    A+

  10. #10
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Par défaut
    Bon, j'ai recréé un projet Based Dialog (merci Pseudo01 pour le "projet boite de dialogue", ca m'a guidé !), et j'ai rajouté dans le constructeur de CDataMinerDlg le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	CPropertySheet s;
    	CPropertyPage page1;
    	CPropertyPage page2;
     
    	s.AddPage(&page1);
    	s.AddPage(&page2);
    	MessageBox(_T("Test"));
    	s.Create(this, WS_CHILD|WS_VISIBLE, WS_EX_DLGMODALFRAME);
    	MessageBox(_T("Test"));
    	this->DoModal();
    Une fois de plus, mon Create plante ! Mais que lui faut-il pour fonctionner ?

  11. #11
    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
    Bonjour,

    voilà comment ça marche chez moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ps=new CSheet("Property Sheet",m_pMainWnd,1);
    page1=new PropertyPage;
    page2=new PropertyPage;
     
    ps->AddPage(page1);
    ps->AddPage(page2);
     
    ps->Create(m_pMainWnd,WS_OVERLAPPEDWINDOW   ,WS_EX_DLGMODALFRAME   );
    ps->ShowWindow(SW_SHOW);
    ce code fonctionne en non-modal (le reste de l'application peut tourner en tache de fond).

    une remarque : créer la page dans le constructeur, ce n'est pas un peu tôt ?
    essaie dans le OnInitDialog() : la boite est alors déjà entièrement créée.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 32
    Par défaut
    Dans le cas ou le CPropertySheet est incrusté dans un CDialog parent voila le code à insérer dans le OnInitDialog :
    s.AddPage(&page1);
    s.AddPage(&page2);
    s.Create(this, WS_CHILD|WS_VISIBLE);

    Je répéte : ne pas faire appel à DoModal()

    ATTENTION il doit exister pour page1 et page2 une ressource boite de dialogue associée; sinon assertion.

    Ok avec Philippe320 ne pas mettre le code dans le constructeur

  13. #13
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Par défaut
    J'ai donc mis dans le initdialog :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	CSheet * ps;
    	CPropertyPage * page1;
    	CPropertyPage * page2;
    	ps=new CSheet(_T("Property Sheet"),m_pMainWnd,1);
    	page1 = new CPropertyPage();
    	page2 = new CPropertyPage();
     
    	ps->AddPage(page1);
    	ps->AddPage(page2);
     
    	ps->Create(m_pMainWnd, WS_OVERLAPPEDWINDOW, WS_EX_DLGMODALFRAME   );
    	ps->ShowWindow(SW_SHOW);
    Le warning de Pseudo01 "ATTENTION il doit exister pour page1 et page2 une ressource boite de dialogue associée; sinon assertion." se vérifie, puisque j'ai l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Une ressource requise était non disponible.
    Que dois-je faire donc pour associer une ressource boite de dialogue à mes pages ?

    En tout cas je vous remercie de m'aider

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 32
    Par défaut
    Editeur de resource ajouter 2 boites de dialogues et créer des classes associées dérivant de CPropertyPage.

  15. #15
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Par défaut
    J'ai donc créé deux boits de dialogues, mais je ne vois pas comment les liers à mes properypages : j'avais pensé les passer au constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    PropertyPage::PropertyPage()
    	: CPropertyPage(IDD_DIALOG1)
    {
     
    }
    Mais j'ai toujours le poblème, je suppose donc que je m'y prends mal.

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 32
    Par défaut
    Avec VC6 dans l'éditeur de resource sélectionne une des nouvelle boites, CTRL-W => une boite de dialogue apparait qui te propose de créer une classe associée à ta resource tu répond oui => une seconde boite apparait dans laquelle tu renseigne le nom de la classe et surtout tu fait attention à bien sélectionné la classe de base CPropertyPage dans le combobox (par défaut il propose CDialog). Tu fais ok, ok.
    Ensuite dans l'éditeur de resource tu sélectionne la seconde boite de dialogue et tu recommence la manip

    Voila tu as 2 classes de créées

    Tu rajoute les include qui vont bien et tu devrais être proche de quelque chose de fonctionnel !

    Avec VS2005 la manip est complètement différente.

    A+

  17. #17
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Par défaut
    Je suis sous VS2005, evidement

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 32
    Par défaut
    Dans l'éditeur de resource sélectionner une des 2 boites de dialogue. Sur la boite faire click droit, choisir "Ajouter une classe", donner un nom à la classe, choisir la classe de base puis OK.
    recommencer avec la 2ieme boite

    Voili voilou

Discussions similaires

  1. Règles d'utilisation des forums C
    Par Franck.H dans le forum C
    Réponses: 3
    Dernier message: 26/01/2008, 17h35
  2. [CR8.5] Utilisation des codes barre
    Par Robert dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 20/01/2005, 16h13
  3. utilisation des sockets sous windows
    Par Tupac dans le forum Réseau
    Réponses: 2
    Dernier message: 21/12/2002, 18h24
  4. [Crystal Report] Utilisation des vues de sql serveur
    Par Olivierakadev dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 15/11/2002, 17h44
  5. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01

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