[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 ?