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] tab control et focus


Sujet :

MFC

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 30
    Points
    30
    Par défaut [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 : 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
    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 ?

  2. #2
    Nouveau membre du Club
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 30
    Points
    30
    Par défaut
    voile avec une photo d'écran rapide :


    je voudrais pouvoir avoir plusieurs tabs controls sur une page, alors qu'apparemment les PropertySheets, ça en gère un global dans le dialog...

    d'où l'utilisation des tabcontrol...

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 30
    Points
    30
    Par défaut
    Bon, je vais me répondre à moi même, parce qu'en attendant, j'ai fini par trouver

    En fait, il ne faut pas utiliser TabControl et simuler l'apparition de Dialog en child...



    Dans la fenêtre où l'on veut implanter des onglets, on place un représentant graphique (une Picture par exemple) que l'on dimensionne à la taille du Tab que l'on souhaite.

    On créé des Dialog child, et l'on créé la classe dérivé de PropertyPage correspondante, pour chaque onglet que l'on veut

    On créé une classe dérivée de PropertySheet, avec une série de membre PropertyPage, où dans les constructeurs on fait des AddPage (où alors on fait une classe bien propre dynamique pour gérer plusieurs tab)

    Dans la class du document où l'on a besoin des tab (la classe issue du dialog où l'on a intégrer la Picture, ou la vue), on met un membre de notre classe dérivé de CPropertySheet, et dans OnInitialUpdate on le créé avec un new.

    Puis on tente de créé une instance avec Create, avec en premier argument, le pointeur sur le CWnd de la Picture contenant le futur tab, et en deuxieme argument WS_CHILD | WS_VISIBLE, et en dernier argument 0.

    Si l'instance a été créé, on récupère les dimensions de la Picture avec un GetWindowRect, et on s'en sert pour placer le Tab avec SetWindowPos avec Null, 0, 0, width (du CRect recupere), height (du CRect recupere), et en dernier argument SWP_NOZORDER | SWP_NOACTIVATE

    Et ça marche ^^


    onglet visible et bouton des dialog actif...

    désolé si ce que je dis n'est pas très compréhensif, mais je ne maitrise pas trop encore les MFC

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/09/2007, 16h43
  2. Couleur et onglet dans le Tab Control Page
    Par loufab dans le forum IHM
    Réponses: 15
    Dernier message: 04/05/2005, 00h04
  3. [MFC][CDialog] interception du focus
    Par r0d dans le forum MFC
    Réponses: 5
    Dernier message: 14/01/2005, 16h00
  4. [mfc]edit control
    Par marseillais57 dans le forum MFC
    Réponses: 4
    Dernier message: 21/06/2004, 10h28
  5. [MFC]Value Controle dans un comboBox
    Par jul54 dans le forum MFC
    Réponses: 6
    Dernier message: 10/02/2004, 09h57

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