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
    Membre averti
    Inscrit en
    D�cembre 2004
    Messages
    46
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2004
    Messages : 46
    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
    Membre averti
    Inscrit en
    D�cembre 2004
    Messages
    46
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2004
    Messages : 46
    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
    Membre averti
    Inscrit en
    D�cembre 2004
    Messages
    46
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2004
    Messages : 46
    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