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 :

Repositionnement des objets dans un CTabCtrl


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 177
    Par défaut Repositionnement des objets dans un CTabCtrl
    Bonjour!
    J'ai codé un objet CDialog, qui est est est lui-même attaché à un objet CTabCtrl, et celui-ci est fixe par rapport à l'autre. En gros, un carré dans un carré!
    Bref, pour gérer les redimensionnements, j'utilise le super template de farscape.
    Malheureusement, dans le cas des objets qui sont contenu dans la deuxième dialogbox, l'attribut sizeRelative ne fonctionne pas.
    Il semblerait que le problème viennent du fait que m_xRatio est à -1.
    Ce qui donne un résultat de calcul toujours égal à 0 (d'ailleurs je me demande un peu pourquoi il ne plante pas sur la division par 0, mais ce n'est pas le sujet)

    Je ne sais pas comment faire pour me sortir de ce pétrin... Merci d'avance de votre aide

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 177
    Par défaut
    Et re...
    Je vais commencer a penser que je sens le paté... Personne ne veut m'aider...
    Bref, pour ceux qui utilisent des Cdialog dans des CDialog

    Et ça doit être le cas de toutes les personnes qui utilisent cette façon de gérer les objets de type CTabCtrl : http://www.codeguru.com/Cpp/controls...cle.php/c2189/

    Bref, quand j'utilisais l'attribut sizeRelative, dans la CDialog attaché à mon onglet, cela me collait toutes contrôles concernés sur la droite de la fenêtre. (Je précise que j'utilise le template génial de farscape, pour la gestion des repositionnements d'objets lors d'un redimensionnement de fenetre : http://cpp.developpez.com/faq/vc/ind...#LayoutControl)

    Je ne saurais dire pourquoi pour le moment, mais le problème venait du calcul du nombre ratio.
    Pour résoudre ce problème, j'ai pris la liberté de modifier le code du template pour gérer un peu mieux les CDialog dans CDialog.
    Je vous préviens, ce n'est pas le summum de la propreté, mais je l'améliorerai plus tard:
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    template <class GENERIC_LAYOUT>
    void CTplLayout<GENERIC_LAYOUT>::AddControl(const UINT resID,
                                                const eSizeType xsize,
                                                const eSizeType ysize,
                                                const bool bFlickerFree)
    {
        CItem item;
    	CRect dialogRect(0,0,0,0);
     
        // create the new item
        CWnd *pWnd=GetDlgItem(resID);
        pWnd->GetWindowRect(item.m_rcControl);
     
        ScreenToClient(item.m_rcControl);
        item.m_rcInitial=item.m_rcControl;
        item.m_bFlickerFree=bFlickerFree;
        item.m_resID=resID;
        item.m_resIDChain=0;
        item.m_xSize=xsize;
        item.m_ySize=ysize;
        item.m_bPercen=false;
        item.m_rcInitialChain=CRect(0,0,0,0);
     
        if(xsize==sizeRelative)
        {
    		if (!GetParent())
    			item.m_xRatio=(double)item.m_rcControl.left/((double)m_rcDialog.Width()-(double)item.m_rcControl.left);
    		else
    		{
    			GetParent()->GetClientRect(&dialogRect);
    			item.m_xRatio=(double)item.m_rcControl.left/((double)dialogRect.Width()-(double)item.m_rcControl.left);
    		}
        }
    	if(ysize==sizeRelative)
    	{
            if (!GetParent())
    			item.m_yRatio=(double)item.m_rcControl.top/((double)m_rcDialog.Height()-(double)item.m_rcControl.top);
    		else
    		{
    			GetParent()->GetClientRect(&dialogRect);
    			item.m_yRatio=(double)item.m_rcControl.top/((double)dialogRect.Height()-(double)item.m_rcControl.top);
    		}
    	}
     
        // add to the array
        m_Items.push_back(item);
    }
    J'espère que ça aidera le plus de personnes possibles.
    En attendant, pour moi, le problème est résolu.

    PS: Farscape, si tu pouvais regarder un peu, juste pour savoir si cela te semble correct. Car, j'ai beau voir que cela fonctionne, j'ai un peu peur des effets de bord, donc... Merci d'avance

  3. #3
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    je n'ai pas encore comparé les codes ,tu as modifié ou exactement ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 177
    Par défaut
    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
     
    if(xsize==sizeRelative)
        {
    		if (!GetParent())
    			item.m_xRatio=(double)item.m_rcControl.left/((double)m_rcDialog.Width()-(double)item.m_rcControl.left);
    		else
    		{
    			GetParent()->GetClientRect(&dialogRect);
    			item.m_xRatio=(double)item.m_rcControl.left/((double)dialogRect.Width()-(double)item.m_rcControl.left);
    		}
        }
    	if(ysize==sizeRelative)
    	{
            if (!GetParent())
    			item.m_yRatio=(double)item.m_rcControl.top/((double)m_rcDialog.Height()-(double)item.m_rcControl.top);
    		else
    		{
    			GetParent()->GetClientRect(&dialogRect);
    			item.m_yRatio=(double)item.m_rcControl.top/((double)dialogRect.Height()-(double)item.m_rcControl.top);
    		}
    	}
    la détection du parent pour se baser sur le CDialog qui contient les objets interressants

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

Discussions similaires

  1. Stockage des objets dans une BD(InstantObject)
    Par Klemsy78 dans le forum Delphi
    Réponses: 3
    Dernier message: 29/03/2007, 20h56
  2. Réponses: 2
    Dernier message: 17/08/2006, 16h24
  3. Déplacer des objets dans un JPanel
    Par hammag dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 23/03/2006, 11h13
  4. J'ai pas les infos des objets dans l'éditeur
    Par mister3957 dans le forum MFC
    Réponses: 3
    Dernier message: 20/02/2006, 19h43
  5. Modifier l'ordre des objets dans dans une liste
    Par Mac_Gyver dans le forum Access
    Réponses: 2
    Dernier message: 24/01/2005, 11h55

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