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: création contenu onglet CTabCtrl dynamique


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 7
    Par défaut MFC: création contenu onglet CTabCtrl dynamique
    Bonjour,
    J'ai pour but de développer une fenêtre contenant plusieurs onglets qui vont se remplir dynamiquement : Combobox, Label... (nombre d'onglet dynamique aussi).
    Cette fenêtre a été crée avec l'outil graphique de Visual 6, mais le reste (CTabCtrl pour les onglets et tout ce qu'ils vont contenir) vont être créés par du code au chargement de la fenêtre.
    Je viens de me faire un petit programme de test afin de construire cette fenêtre.
    Pourriez vous m'aider pour spécifier à quel onglet va "appartenir" ma ComboBox ?

    ma classe correspondant a ma fenêtre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class CDlgFormDyn : public CDialog
    Voici une partie de mon code de l’implémentation de cette classe
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    BOOL CDlgFormDyn::OnInitDialog() 
    {
    CDialog::OnInitDialog();
    	m_tab_ongl	= new CTabCtrl();
    	m_tab_ongl->Create(TCS_TABS,CRect(5,70,950,600),this,1);
    	m_tab_ongl->ShowWindow(SW_SHOW);
     
    	test() ;
    	UpdateData(FALSE);
    	return TRUE;
    }
     
    void CDlgFormDyn::test() 
    {
    CComboBox* cbBox;
    CButton* cbt = new CButton();
    CRect rect;
     
    TC_ITEM TabItem;
    TabItem.mask = TCIF_TEXT | TCIF_IMAGE;
    TabItem.pszText = "onglet3";
     
    // 2 facons de créer mes onglets
    m_tab_ongl->InsertItem(0, "onglet1");
    m_tab_ongl->InsertItem(1, "onglet2");
    m_tab_ongl->InsertItem(2, &TabItem);
     
    GetWindowRect(&rect);
    rect.left	= POS_X_DEB;			//20
    rect.right	= rect.left+TAILLE_X;		//20+80
    rect.top	= POS_Y_DEB;			//90
    rect.bottom = rect.top+TAILLE_Y;		//90+20	
     
     
    	for(int i=0; i<20; i++) {
    		cbBox = new CComboBox();
     
    		if(!cbBox->Create(CBS_DROPDOWNLIST | WS_VISIBLE,rect2,m_tab_ongl,1))
    			return;      // fail to create
    		cbBox->AddString("ma combobox");
    		cbBox->ShowWindow(SW_SHOW);
     
    		rect2.left += 100;
    		rect2.right = rect2.left+TAILLE_X;
    		maj_rect(rect2);
    	}
    }
     
    bool CDlgFormDyn::maj_rect(CRect& rect) 
    {
    	if(rect.left > SIZE_MAX_X) {
    		rect.left	= POS_X_DEB;
    		rect.right	= rect.left+TAILLE_X;
    		rect.top	+= INCR_Y;
    		rect.bottom = rect.top+TAILLE_Y;
    		return true;
    	}
    	return false;
    }
    Je n'utilise pas de "view" car je dois intégrer ceci dans un module déjà existant n’ayant pas cette spécificité.

    Quelqu'un a t il une idée ou a deja été confronté à ce problème ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 487
    Par défaut
    Pourquoi utiliser directement un CTabCtrl plutôt qu'une CPropertySheet ?

    Ci-dessous une référence VS2012 mais je suis quasi certain que cela existait déjà en VC++6.
    http://msdn.microsoft.com/en-us/library/614xe086.aspx

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 7
    Par défaut
    Merci. Donc en gros, mon CTabCtrl devient CPropertySheet et mes différents onglets des CPropertyPage.
    Au lieu d'utiliser des "AddItem", j'utilise des "AddPage".
    Par contre j'ai un pointer null lors du create.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CPropertySheet*	m_tab_ongl	= new CPropertySheet();
     
    CPropertyPage* page1 = new CPropertyPage("onglet1");
    CPropertyPage* page2 = new CPropertyPage("onglet2");
     
    m_tab_ongl->AddPage(page1);
    m_tab_ongl->AddPage(page2);
     
    m_tab_ongl->Create(this,WS_CHILD | WS_VISIBLE);

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 487
    Par défaut
    Je pense qu'il faut fournir lID du template associé à chaque CPropertyPage avant de créer la PropertySheet.
    L'assert doit d'indiquer, directement ou indirectement la chose à initialiser avant d'utiliser la méthode où l'assert t'engueule.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 7
    Par défaut
    oui le null pointer exception vient bien de cette fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void CPropertyPage::PreProcessPageTemplate(PROPSHEETPAGE& psp, BOOL bWizard)
    {
    	....
    	ASSERT(pTemplate != NULL);
    }
    Par contre je ne vois pas comment initialiser ce "template" afin qu'il ne soit plus null lors de l'appel du create


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CPropertyPage* page1 = new CPropertyPage();
    page1->Create("onglet1",m_tab_ongl);
    page2->Create("onglet2",m_tab_ongl);
    m_tab_ongl->AddPage(page1);
    m_tab_ongl->AddPage(page2);
    En tentant cette approche mais des le 1er create sur ma CPropertyPage j'ai un assert(false)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    BOOL CDialog::Create(LPCTSTR lpszTemplateName, CWnd* pParentWnd) {
    ...
    if (!_AfxCheckDialogTemplate(lpszTemplateName, FALSE))
    		ASSERT(FALSE);          // invalid dialog template name
    }
     
    BOOL AFXAPI _AfxCheckDialogTemplate(LPCTSTR lpszResource, BOOL bInvisibleChild) {
    ...
    	HRSRC hResource = ::FindResource(hInst, lpszResource, RT_DIALOG);
    }
    hResource vaut NULL

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 487
    Par défaut
    Une propertypage, c'est un peu comme une boite de dialogue, vous devez donner un template pour créer correctement les contrôles qu'elle doit contenir.

Discussions similaires

  1. [XL-2007] Création d'onglet en fonction d'une colonne dynamique
    Par problemeaide dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/12/2012, 16h16
  2. Réponses: 1
    Dernier message: 08/03/2010, 14h01
  3. Création d'onglets dynamiquement
    Par nicolav dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 03/07/2009, 13h35
  4. [MFC] Création dynamique d'ocx
    Par tyarcaouen dans le forum Visual C++
    Réponses: 2
    Dernier message: 28/01/2008, 14h09
  5. [MFC] communication entre onglets d'une fenêtre
    Par bigboomshakala dans le forum MFC
    Réponses: 12
    Dernier message: 29/05/2004, 12h12

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