Visual C++

Signaler
Messages postés
65
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
15 juillet 2004
-
Messages postés
65
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
15 juillet 2004
-
Bonjour,
J'ai ajouter un Tab Control à mon projet afin de construire des onglets,mais je ne sais vraiment pas comment m'y prendre.j'ai ajouter d'autres boites de dialogue mais je ne sais pas comment mettre le lien avce mon Tab Control.
Merci de m'aider.

15 réponses

Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
dans mes sources y'a 2 exemples, 1 avec lesMFC et l'autre avec l'API Win32.
Messages postés
65
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
15 juillet 2004

Merci bq,mais tu veux bien m'expliquer le principe.j'aimerai comprendre les boites de dialogue filles sont liées comment avec la boite de dialogue mère?Ce que j'aimerai c coprendre le principe des Tab Control.
merci
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
en fait dans le dialogue pricipal, il y a le TabCtrl. Dans le traitement de WM_INITDIALOG, je crée les onglets comme des enfants de ce dialogue en ne les affichantas pas (style WS_VISIBLE non coché dans les ressource).
Je fait également en sorte de les placée au milieu du TabCtrl.
Ensuite, je sélectionne un onglet et j'affiche ce dialogue.
Quand l'utilisateur change d'onglet, le message WM_COMMAND est reçu avec le code de notification TCN_SELCHANGE, j'affiche donc le dialogue enfant adéquate.
La gestion des contrôles situés dans chaque dialogue enfant se fait dans tes DlgProc séparée et sont donc indépendant. il est cependant possible d'ajouter une fonction permettant d'appliquer les modifications apportées à chacun des onglets.

en conclusion, le tabcontrol ne gère que les titres des onglets, c'est à toi de décider d'afficher ce que tu veux en fonction de l'onglet sélectionné.
Messages postés
65
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
15 juillet 2004

Merci pour les explications, je vais essayer de les appliquer.
Messages postés
65
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
15 juillet 2004

resalut,
j'ai essayé de donner à mes boites de dialogues filles la meme dimension que mon Tab controles mais je trouve des difficultés.la fonction SetWindowPos() ne veut pas m'obeir!:)je sais pas quel coordonée ca prend,je pensais pourtant que l'axe des x est vers le bas et des y est vers la gauche mais apparement c'est pas juste.
j'ai essayé ce code la mais ca marche pas:
nX=itemRect.left;
nY=itemRect.bottom+1;
nXc=tabRect.right-itemRect.left-1;
nYc=tabRect.bottom-nY-1;
Merci de m'aider.
voila coment je les utilise
m_boite[nCount]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_HIDEWINDOW);
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
x pointe vers la droite et y vers le bas. De plus pas la peine de faire des -1 et +1 car les coorodonnées des rectangles sont exclusives à droite et à gauche. En gros pour avoir la taille en pixel d'un rectangle, tu fait simplement right-left et bottom-top.
Messages postés
65
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
15 juillet 2004

oui,j ai deja fait les rectifications mais c sans resulat,tjrs mes boites filles sont décalées par rapoort à mon TabControl,j ai ecris le code suivant:
int x,y,w,h;
CPaintDC MonDC(this);
MonDC.SetMapMode(MM_TEXT);
CRect fenetre, TabRect;
GetClientRect(fenetre);
MonDC.DPtoLP(fenetre);
CPoint PtCentre(fenetre.Width()/2,fenetre.Height()/2);
m_TabCtrl.GetClientRect(TabRect);

x=PtCentre.x-TabRect.Width()/2;
y=PtCentre.y-TabRect.Height()/2;
w=TabRect.Width();
h=TabRect.Height();

m_boite[0]->SetWindowPos(&wndTop, x, y, w, h, SWP_NOZORDER);
m_boite[1]->SetWindowPos(&wndTop, x, y, w, h, SWP_NOZORDER);

J'aimerai faire des boites de dialogue fille qui auront exaceteme,nt la meme taile que le TabCOntrol.
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
il ne faut pas centrer par rapport au rectangle du TabCtlr mais la zone d'affichage, il faut rajouter :
m_TabCtrl.GetClientRect(TabRect);
m_TabCtrl.AdjustRect(FALSE, rcTabCtrl);
Messages postés
65
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
15 juillet 2004

merci mais Je centre deja par rapport à la zone d'affichage(fenetre)j ai les fenetres filles bien centrés mais tjrs décalée du Tab control,resultat;dals l afficahe j ai toujours un decalage.donc je dois l ajuster à la main dans mon programme ce que je veux eviter.j'aimerai que ca soit ajuster automatiquement par mon programme.
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
je ne comprend pas comment ça se fait que tu as un décalge, dans mon prog, cette fonction marche :

// détermination du rectangle où placer les dialogues enfants à partir du rectangle
// du TabCtrl, conversion dans le system de coordonnées de la boîte de dialogue
// parente
CRect rcTabCtrl;
m_TabCtrl.GetWindowRect(rcTabCtrl);
m_TabCtrl.AdjustRect(FALSE, rcTabCtrl);
ScreenToClient(rcTabCtrl);

// création des boîtes de dialogues filles
CSize sizeMax(0, 0);
m_apChildTabDlg = new CChildTabDlg* [_countof(s_aChildTabDescr)];
for(int i = 0; i < _countof(s_aChildTabDescr); i++)
{
// création dialogue
m_apChildTabDlg[i] = (CChildTabDlg*) s_aChildTabDescr[i].m_pClass->CreateObject();
m_apChildTabDlg[i]->Create(s_aChildTabDescr[i].m_nId, this);

// ajout onglet
m_TabCtrl.InsertItem(i, s_aChildTabDescr[i].m_lpszName);

// taille, on le place au centre du TabCtrl
CRect rcChildDlg;
m_apChildTabDlg[i]->GetWindowRect(rcChildDlg);
int x = (rcTabCtrl.left+rcTabCtrl.right)/2 - (rcChildDlg.Width())/2;
int y = (rcTabCtrl.top+rcTabCtrl.bottom)/2 - (rcChildDlg.Height())/2;
m_apChildTabDlg[i]->SetWindowPos(NULL, x, y, 0, 0, SWP_NOZORDER|SWP_NOSIZE);
}

Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
une chose importante sur la taille du TabControl, il y a 2 zones :
- le rectangle de fenêtre (donné par GetWindowRect ou GetClientRect)
- le rectangle d'affichage des onglets.

2 cas se posent.
- tu as une taille préférée pour des onglet, et tu veu dimensionner le TabContol :
AdjustRect(TRUE, rc);
rc est le rectangle où tu souhaite afficher les onglets, après l'appel contiendra le rectangle où placer le TabControl avec SetWindowPos.

- tu as une taille donnée pour le TabControl et tu souhaite savoir où seront placer les onglets :
AdjustRect(FALSE, rc);
rc est le rectangle de fenêtre du TabControl et après l'appel contiendra la zone d'affichage dans laquelle centrer.

ENsuite, il est imporatant de savoir qui est le parent des onglets (le TabControl ou le Dialog), car la position de ceux-ci est relatif à la zone cliente du parent, qui dans le cas du TabControl n'est pas la zone d'affichage mais bien le rectangle de fenêtre, alors que dans le cas du dialogue c'est bien la zone d'affichage (entre les bordues et le titre).
Messages postés
65
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
15 juillet 2004

Dans ton programme tu t en fiche de la taille de tes boites de dialogue fille,tu les affiches juste au centre.alors que pour moi la couleur de mes boites de dialogue est differente que celle de la boite mere,alors le decallage est tres ramarquable.
la taille de mes boites filles doivent avoir la meme taille que le tab control ainsi que le meme positionnement,ja i reussi en parti mais qd je deplace dans mon programme l tab control tt est foutu!
j'ai modifié un peu ton programme pour te montrer la source de mes problemes:(
Messages postés
65
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
15 juillet 2004

voila ta source un peu modifié pour montrer le pb:
CRect rcTabCtrl,rect;
m_TabCtrl.GetWindowRect(rcTabCtrl);
m_TabCtrl.AdjustRect(FALSE, rcTabCtrl);
//ScreenToClient(rcTabCtrl);

// création des boîtes de dialogues filles
CSize sizeMax(0, 0);
m_apChildTabDlg = new CChildTabDlg* [_countof(s_aChildTabDescr)];
for(int i = 0; i < _countof(s_aChildTabDescr); i++)
{
// création dialogue
m_apChildTabDlg[i] = (CChildTabDlg*) s_aChildTabDescr[i].m_pClass->CreateObject();
m_apChildTabDlg[i]->Create(s_aChildTabDescr[i].m_nId, this);

// ajout onglet
m_TabCtrl.InsertItem(i, s_aChildTabDescr[i].m_lpszName);
m_TabCtrl.GetClientRect(rect);

// taille, on le place au centre du TabCtrl
CRect rcChildDlg;
m_apChildTabDlg[i]->GetWindowRect(rcChildDlg);
int x = (rcTabCtrl.left+rcTabCtrl.right)/2 - (rcChildDlg.Width())/2;
int y = (rcTabCtrl.top+rcTabCtrl.bottom)/2 - (rcChildDlg.Height())/2;
int xx=rect.Width();
int yy=rect.Height();

m_apChildTabDlg[i]->SetWindowPos(NULL, x, y,xx, yy, SWP_NOZORDER);
}
Messages postés
65
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
15 juillet 2004

merci pour les expliacations que j ai pas vu hier,je vais essayer de les appliquer!
Merci encore
Messages postés
65
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
15 juillet 2004

salut
j arrive tjrs pas à positionner mes fenetres filles exactement sur mon tab controle,j utilise bien AdjustRect pour ajuster la taille de mes fenetres sur celle du tab Controle et elles ont bien la meme taille mais comment je peux faire pour preciser qui est le parent de mes onglets?pour reussir à les mettre exactement sur le tab controle au moment de compilation.