[MFC] tab control et focus
Bonjour,
� la base, je dois g�rer des onglets, rien de bien m�chant, si ce n'est qu'ils sont dans ma page, avec le reste des controles.
Je sais qu'il existe les PropertySheet et PropertyPage, mais toutes les aides que j'ai pu trouver sur le net � ce sujet ne sont ax�s que sur une fen�tre de Dialog ne comportant que des onglets et des boutons inutiles (appliquer, etc)
Mais moi je veux �a dans ma fenetre principale (Projet MDI, avec la vue principale en FormView)
Donc, j'essaye d'int�grer un Tab Control que je place sur ma fen�tre � la taille et � la place qu'il faut.
Je r�cup�re le clic, et suivant l'onglet cliqu�, je souhaite afficher une ressource DIALOG correspondante.
Bon, alors l�, dans OnInitialUpdate de la vue :
- je cr�� tous les dialogs avec un new (d�clar� CHILD, sans bordure, sans titre)
- je lance un Create pour chaque dialog avec parent � NULL (j'ai essay� plein de parent, �a change apparemment rien oO)
- je cr�� les onglets avec des strings
- j'affiche l'onglet 0 par d�faut
pour le clic, c'est facile, je r�cup�re le GetCurSel de mon tabcontrol, et affiche le dialog/onglet correspondant
l'affichage d'un onglet est comme suit :
Code:
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
| void InterfaceTab::Afficher(int pos)
{
if (pos>=0 && pos<listeTab.GetCount())
{
// un tab qui existe :)
// etape 1 : rendre l'onglet précédent invisible (sauf si premiere fois, ou si le même)
CDialog *p;
if (lastTab>=0 && currentTab!=lastTab)
{
p = listeTab.GetAt(lastTab);
p->ShowWindow(SW_HIDE);
p->SetWindowPos(&CWnd::wndBottom,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
}
lastTab=currentTab;
currentTab=pos;
// ensuite on affiche celui sélectionné à la position qu'il faut
CRect r;
p = listeTab.GetAt(pos);
p->GetWindowRect(r);
p->SetWindowPos(&CWnd::wndTopMost,3,27,r.Width(),r.Height(),SWP_SHOWWINDOW | SWP_NOZORDER);
p->ShowWindow(SW_SHOW);
p->SetFocus();
}
} |
Le r�sultat :
l'onglet-dialog s'affiche bien, mais impossible d'avoir le focus avec la souris.... Je peux cliquer partout sur la fen�tre, c'est le TabControl (ou la fenetre principale en fait) qui r�cup�re le focus....ce rend tout controle dans cet onglet inop�rant (bouton, checkbox, etc...)
Une fois en modifiant un peu tout et n'importe quoi, j'ai r�ussi � avoir le focus sur l'onglet-dialog, mais elle ne s'affichait pas (on cliquait sur des trucs invisibles, mais les reactions des boutons, par exemple un message box s'effectuait bien)
j'ai ajout� un "Afficher" dans le paint... Alors suivant les essais (affichage avec un CWnd sp�fici� dans le showWindow par exemple, ou en wndBottom, etc... ) �a fait des flash de dessins de fen�tre...
Bref, pourquoi il n'y a pas un truc simple pour g�rer les onglets en MFC ? :/
Peut on faire un truc simple avec les PropertySheet/Page ?
Je pr�f�re quand m�me l'utilisation des tab sous VisualBasic... mais bon, l� j'ai pas trop le choix...
je sais qu'au pire je peux m'amuser (youpi) � faire tout en dynamique pour m'assurer les onglets, mais je pr�f�re tenter l'utilisation des Dialog en ressources...
Donc au jour d'aujourd'hui, visuellement, j'ai bien des tab + onglets... sauf que les onglets ne sont que visuels, et que si je met des boutons dedans, ils sont inclicables...
En mettant les Dialog en POPUP au lieu de CHILD, �a marche parfaitement, si ce n'est qu'on voit la fen�tre principale perdre le focus (barre de titre gris�e), et que c'est moyen je trouve... (et le positionnement change aussi, car plus relatif � la fen�tre parent ^^)
Comment rendre les controles de ce dialog child utilisable ?