[C++][MFC] Problème avec les onglets

cs_impress Messages postés 3 Date d'inscription mercredi 28 avril 2004 Statut Membre Dernière intervention 2 juin 2004 - 1 juin 2004 à 11:18
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 - 3 juin 2004 à 00:20
Bonjour,
Après avoir parcouru différents forums et tutoriaux, j'ai réussi (enfin !) à créer des onglets de façon propre.
Le problème, c'est que je n'arrive pas à accéder/modifier les infos des CPropertyPage associées à la CPropertySheet que je crée.

Par exemple, je crée un onglet (CPropertySheet onglets), une page (CPropertyPage m_dlg1) dans laquelle j'ai un champ d'edit (m_champedit), et quand je lance une commande du style onglets.m_dlg1.m_champedit.SetWindowText("toto") ca me met un msg d'erreur "Debug assertion failed".
Pareil qd je veux modifier le titre de ma CPropertyPage (j'aimerais le faire de facon dynamique).

Une idée sur la source de l'erreur ??

PS : un bout de code pour voir

COnglets::COnglets(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
AddPage(&m_dlg1);
AddPage(&m_dlg2);
}

void CConfigDlg::OnBoutonConfig() 
{
COnglets onglets(_T("Titre"));
onglets.m_dlg1.m_champedit.SetWindowText("test"); // ici ca merde
onglets.DoModal();
}

5 réponses

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
2 juin 2004 à 15:01
Le problème, c'est que les contrôles ne sont créés que pendant l'appel à DoModal(). Avant ils n'existent pas encore et après ils n'existent plus. Il faut associer un CString à l'Edit et utiliser UpdateData(), mais bon là dessus je maitrise pas des masses. L'autre solution est de rajouter des variables à la classe COnglets, de les initialiser avant le DoModal(), puis de traiter le mesage WM_INITDIALOG avec OnInitDialog et de faire ton SetWindowText() car à ce moment les contrôles existent.

PS : j'avias mis un exemple de dialogue à onglet en utilisant Un CTabControl et des CDialog enfant indépendant poour chaque onglet :
http://www.cppfrance.com/code.aspx?ID=20735
0
cs_impress Messages postés 3 Date d'inscription mercredi 28 avril 2004 Statut Membre Dernière intervention 2 juin 2004
2 juin 2004 à 16:32
Salut,
En fait j'avais deja regarde ton code en faisant des recherches sur les onglets, mais j'ai eu du mal a le recuperer, et j'ai prefere repartir de 0.

Finalement j'ai resolu mon probleme en initialisant mes onglets dans le fichier de la classe derivee de CPropertyPage, et non dans le fichier principal. Pour modifier les titres, j'ai trouve un bout de code sur developpez.com ;)
Donc dans le fichier principal je cree juste mes CPropertyPage comme ca :
	COnglets onglets(_T("Toto"));
pMesOnglets=&onglets;

for (int i=0;i<nb_motifs;i++)
{
tabDlg[i]=new CDlg; // tabDlg est declare en globale
tabDlg[i]->m_psp.dwFlags |= PSP_USETITLE ; // ici je modifie le titre de facon dynamique
tabDlg[i]->m_psp.pszTitle = motif[i]->nom ;
onglets.AddPage(tabDlg[i]);
}

onglets.DoModal();


et j'initialise les propertypage comme ca (les onglets sont en fait identiques... je n'ai donc cree qu'une seule classe derivee de CPropertyPage appelee CDlg)

BOOL CDlg::OnSetActive() 
{
// réglage de l'échelle des sliders
m_slider_a.SetRange(0,40);
m_slider_a.SetTicFreq(4);
m_slider_tim.SetRange(0,1000);
m_slider_tim.SetTicFreq(50);
m_slider_tit.SetRange(0,500);
m_slider_tit.SetTicFreq(50);
m_slider_tc.SetRange(0,100);
m_slider_tc.SetTicFreq(10);

// on récupère le numéro de la page CPropertyPage active dans la CPropertySheet
// pointée par 'pMesOnglets' (= &onglets)
int nid=pMesOnglets->GetActiveIndex();

// mise à jour des valeurs des sliders (lues dans motifs.vtl)
m_slider_a.SetPos(motif[nid]->amplitude);
m_slider_tim.SetPos(motif[nid]->temps_inter_motifs);
m_slider_tit.SetPos(motif[nid]->temps_trames);
m_slider_tc.SetPos(motif[nid]->temps_cycle);

return CPropertyPage::OnSetActive();
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
2 juin 2004 à 23:21
y'a pas possibilité de faire ça dans OnInitDialog ou OnCreate car je pense que ça serait mieux là. OnSetActive risque d'être apelée plusieures fois si ton appli passe au second plan puis revient devant. Phénomène à tester toutefois car je n'en suis pas très sûr.
0
cs_impress Messages postés 3 Date d'inscription mercredi 28 avril 2004 Statut Membre Dernière intervention 2 juin 2004
2 juin 2004 à 23:35
Effectivement, le probleme c'est que je mets a jour mes onglets a chaque fois que l'utilisateur en change (je mets a jour les motif[i] presents dans le code... et OnInitDialog n'intervient qu'une fois au lancement de la fenetre, pas apres, si ?

Bon ceci dit l'appli que j'ai codee me sert uniquement comme outil pour tester un prototype, donc qd je la lance, elle ne passe jamais au second plan (en gros je code un peu sale :big) , vu que je suis pas programmeur a la base héhé).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
3 juin 2004 à 00:20
OnInitDialog et OnCreate ne sont appelée qu'une seule fois à la création respectivent d'un dialogue (ou d'un dialogue enfant ce qui est le cas des propertysheetpage je pense) et d'une fenêtre
0