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] Heriter d'une classe CView Probleme avec constructeur


Sujet :

MFC

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 11
    Points : 5
    Points
    5
    Par défaut [MFC] Heriter d'une classe CView Probleme avec constructeur
    Voila j'ai un souci avec le constructeur de ma classe CSupervision qui herite de la classe CView
    le souci c'est que la MFC le crée en contructeur protected donc la j'ai aucun moyen de m'en servir
    Or avec une classe qui derive d'une CDialog j'avais la possibilité d'afficher mes fenetres avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	CSupervision *Supervision = new CSupervision; 
    	Supervision->Create(IDD_SUPERVISION); 
    	Supervision->ShowWindow(SW_SHOW);
    mais la j'ai une erreur a chaque fois qui me dit que le construteur est proteger
    pour eviter ceci je passe alors mon constructeur dans les fonctions public mais ensuite j'ai un souci avec la fonction Create qui n'accepte pas un seul parametre donc je suis bloqué
    si yen a qui ont des idées je suis preneur voila bon app sinon

  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,
    le constructeur est protégé parce qu'une view n'est pas conçue pour se construire comme ça.
    que veux tu faire exactement ?
    ton projet est de quel type : MDI / SDI ?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Ah, j'ai le même problème dans la question 1 de mon post http://www.developpez.net/forums/vie...631853#1631853
    (avec la classe CMyProjectDoc mais le principe est le même, pourquoi on ne peut pas aller dedans [sauf effectivement en mettant public pour le constructeur mais si c'est pas fait comme ça par défaut, il doit y avoir une raison...)

  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
    Citation Envoyé par farscape
    salut,
    le constructeur est protégé parce qu'une view n'est pas conçue pour se construire comme ça.
    c'est le mecanisme document template (OpenDocumentFile) qui se charge de construire l'objet .
    c'est pour ça que le constructeur est protect c'est pour eviter au programmeur de faire des betises.
    si on doit creer une nouvelle fenetre ou rajouter de nouvelles fenetres de type view il faut utiliser les fonctions du FrameWork (CMDIxxx) adaptées.
    voir faq:
    http://c.developpez.com/faq/vc/?page...ltiDocTemplate
    http://c.developpez.com/faq/vc/?page...OnSameDocument


  5. #5
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    je veux faire un projet dialog based donc apres je sais pas si ca marchera mais avec la class CDialog en heritage ca passais tres bien mais me manque l'option OnDraw qui est dans la classe view donc j'ai decider de changer pour pouvoir deciner avec pDC
    bon je pense mettre expliquer si ta une solution je suis ok

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    normal dans un dialog il n'y a pas de OnDraw , mais il y a le message OnPaint.
    la question suivante c'est que veut tu faire exactement ?
    dessiner sur un partie de la dialogue ?


  7. #7
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    ba je veux sur la fenetre Supervision avec IDC_SUPERVISION qui a pour class CSupervision qui herite de CView
    je veux dessiner dessus
    j'avais deja commencer un projet avec comme derivé une classe CDialog mais justement ya le OnPaint et moi je veux du OnDraw
    donc je suis obligé de passé par une classe CView mais a ce moment la le constructeur deviens Protected sauf si je le met dans dans public mais le souci c'est qu'il ne reconnais pas plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CSupervision *Supervision = new CSupervision;
    donc voila ma question comment je faits

  8. #8
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    salut,

    Pour ne pas entrer en contradiction avec Farscape je crée mes vus ainsi:
    Il s'agit d'un de mes prog de permutation de vues dans un prog MDI
    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
     
    void CChildFrame::SelectView(int ViewID)
    {
    	CView* pOldActiveView = GetActiveView();
    	CView* pNewActiveView = (CView*) GetDlgItem(ViewID);
     
    	if(pNewActiveView == NULL)
    	{
    		switch(ViewID)
    		{
    		case ID_MATRIX_VIEW:
    			pNewActiveView = new CMatrixFormView();
    			TRACE("Create CMatrixFormView\n");
    			break;
     
    		case ID_CURRENT_VIEW:
    			pNewActiveView = new CCurrentFormView();
    			TRACE("Create CCurrentFormView\n");
    			break;
     
    		case ID_CURRENTDB_VIEW:
    			pNewActiveView = new CRatedCurrentView();
    			TRACE("Create CRatedCurrentView\n");
    			break;
     
    		case ID_VOLTAGEDB_VIEW:
    			pNewActiveView = new CRateVoltageView();
    			TRACE("Create CRateVoltageView\n");
    			break;
     
    		default:
    			AfxMessageBox("ID de vue invalide");
    			return;
    		}
     
    		CCreateContext context;
    		context.m_pCurrentDoc = pOldActiveView->GetDocument();
    		pNewActiveView->Create(NULL, NULL, 0L, CFrameWnd::rectDefault, this, ViewID, &context);
    	}
     
    	SetActiveView(pNewActiveView);
    	pOldActiveView->ShowWindow(SW_HIDE);
    	pNewActiveView->ShowWindow(SW_SHOW);
    	pOldActiveView->SetDlgCtrlID(m_CurrentViewID);
    	pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
    	m_CurrentViewID = ViewID;
    	RecalcLayout();	
    }
    Les constructeurs sont rendus publics dans leurs classes respectives.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    int m_CurrentViewID;  // à déclarer comme public dans CChildFrame
     
    CChildFrame::CChildFrame()
    {
    	m_CurrentViewID = -1;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // à déclarer dans un fichier .h par exemple constant.h
     
    enum { ID_POWERCIRCUIT_VIEW,
    	   ID_MATRIX_VIEW,
    	   ID_CURRENT_VIEW,
    	   ID_EQUIPMENT_VIEW,
    	   ID_VOLTAGEDB_VIEW,
    	   ID_CURRENTDB_VIEW,
    	   ID_NORMALIZE_VIEW
    };
    Gabrielly

  9. #9
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    euh la je sais pas ou tu m'envoie mais je suis perdu je comprends pas trop ce code enfin du moins l'utilité que je peux exploiter donc si ta de plsu ample information je suis preneur

  10. #10
    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
    oui ,
    je n'ai pas dis que c'etait impossible j'ai expliqué pourquoi c'est comme ça.
    dans ton cas ok mais tu sors completement de la creation et l'utilisation "standard" d'une view .
    dans son contexte c'est uniquement pour dessiner sur la dialog ,et comme il n'avait pas de ondraw il a transformé en view .
    il suffit de mettre un control owner draw sur la dialog et de placer sa logique de dessin dedans ,pour s'affranchir de la postion et taille du dessin.

    il cherche dessin ou courbe sur le forum ça ete evoqué plusieurs fois et ça s'appui sur du code present dans la faq + un exemple avec un fichier zip.

  11. #11
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Je suis tout à fait d'accord avec toi, je voulais juste montrer une autre alternative

  12. #12
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    oui ca j'ai compris pour dessiner c'est bon j'ai developper un morceau de mon IHM avec la fonction On draw
    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
     
    void CTestView::OnDraw(CDC* pDC)
    {
    	CTestDoc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    	CPen aPen,bPen,cPen;
    	aPen.CreatePen(PS_SOLID,2,RGB(128,128,128));
    	bPen.CreatePen(PS_SOLID,4,RGB(192,192,192));
    	cPen.CreatePen(PS_SOLID,4,RGB(255,255,255));
    	CPen* aoldPen = pDC->SelectObject(&aPen);
    	CPen* boldPen = pDC->SelectObject(&bPen);
    	CPen* coldPen = pDC->SelectObject(&cPen);
    	int z,j,i;
    	for(z=0;z<4;z++)
    	{
    	// TODO: add draw code for native data here
     
     
    	pDC->SelectObject(&aPen);
    	pDC->MoveTo(50,50);
    	for(i=50;i<200;i++)
    	{
    		pDC->LineTo(i,50);
    		pDC->LineTo(i,100);
    	}
    	pDC->SelectObject(aoldPen);
     
    	pDC->SelectObject(&bPen);
    	for(i=201;i<300;i+=3)
    	{
    		pDC->MoveTo(i,60);
    		pDC->LineTo(i,90);
    		Sleep(1);
    	}
    jusque la aucun probleme mais c'est quand j'ai changer ma classe de base une CDialog par une CView et bien la ma fenetre ne s'affiche plus dans
    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 CTampoDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
     
    CCamera *Camera = new CCamera; 
    CSupervision *Supervision = new CSupervision; 
     
    	// Set the icon for this dialog.  The framework does this automatically
    	//  when the application's main window is not a dialog
    	SetIcon(m_hIcon, TRUE);			// Set big icon
    	SetIcon(m_hIcon, FALSE);		// Set small icon
     
    	// TODO: Add extra initialization here
     
    	Camera->Create(IDD_CAMERA); 
    	Camera->ShowWindow(SW_SHOW);
     
     
    	//Supervision->Create(IDD_SUPERVISION); 
    	Supervision
    	Supervision->ShowWindow(SW_SHOW); 
     
    	return TRUE;  // return TRUE  unless you set the focus to a control
    }
    donc si on prends ma classe camera qui herite de d'une CDialog la ya pas de souci elle s'affiche lors de la compilation mais ensuite si je test avec la fenetre supervision elle ne se lance pas
    il ne connais pas la fonction create
    enfin celle de la classe CView et celle de la classe CDialog ne sont pas pareil
    une a 1 argument (CDialog) et l'autre en a 7 (CView)

    donc ya un souci a ce niveau la
    donc je veux le faire a partir d'une CView
    je pense que la la situation est plus clair voila merci

  13. #13
    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
    la question c'est ,au niveau de ta dialog tu as des controles ou tu utilises toute la surface de celle-ci pour dessiner ?
    si c'est le cas tu aurais plutot interet à generer un projet SDI et de choisir une CView pour la classe fenetre .
    comme ça tu as ta CView le ondraw etc ....

  14. #14
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    aucun controle juste du dessin mais je reste comme ca mais je veux savoir si j'ai un moyen pour afficher ma fenetre lors de l'execution dans le BOOL CTampoDlg::OnInitDialog()

    voila c'est ca ma question

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/08/2008, 06h46
  2. Héritage d'une classe MFC et d'une classe non MFC
    Par Etienne Paquette dans le forum MFC
    Réponses: 7
    Dernier message: 04/12/2007, 20h19
  3. Réponses: 1
    Dernier message: 07/09/2005, 22h15
  4. [MFC]Ouverture d'une base de donnee avec DAO
    Par Wyatt dans le forum MFC
    Réponses: 7
    Dernier message: 24/01/2005, 10h06
  5. [MFC] Créer dynamiquement une classe
    Par vanitom dans le forum MFC
    Réponses: 9
    Dernier message: 11/12/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