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 :

Redimensionnent CListCtrl [FAQ]


Sujet :

MFC

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 16
    Points : 8
    Points
    8
    Par défaut Redimensionnent CListCtrl
    Bonjour,
    Voici quelques temps que j'essaye de redimensionner ma CListCtrl lorsque que je redimensionne mon CDialog!J'ai essayé de le faire dans une fonction OnSize()
    Probleme je n'arrive pas à ce que le taux d'agrandissement soit proportionnel,
    y compris les colonnes.
    Je ne vois que l'option supprimer et redessiner ma CListCtrl.
    Y'a t-il un autre moyen?
    Merci d'avance

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Salut,

    pourquoi n'utilises-tu pas SetWindowPos()?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,

    C’est pourtant la bonne méthode.

    Pour le dimensionnement du contrôle tu considères qu’il représente x pourcent de la fenêtre
    Pour un dimensionnement dynamique :
    Au début du dimensionnement avec le message WM_ENTERSIZEMOVE et wparam==SC_SIZE :
    Il faut calculer la taille relative du contrôle dans la fenêtre.
    Pour le contrôle il faudra mémoriser la taille relative des colonnes par rapport à la CListCtrl.
    Sur OnSize :
    Tu rappliques les ratios calculés sur le contrôle par rapport à la fenêtre
    Même chose pour les colonnes de la CListCtrl.

    Pour un dimensionnement en fin de resize :
    Maintenant tu peux faire tout ça à la fin du dimensionnement de la fenêtre en interceptant le message WM_EXITSIZEMOVE et wparam==SC_SIZE

    Note: ces messages devront être implémentés manuellement ,ils n'apparaissent pas dans classwizard

  4. #4
    Futur Membre du Club
    Inscrit en
    Mars 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Merci pour ces reponses rapides.
    J'essaye de me documenter sur ta solution farscape car celle de r0d ne me convient pas réelement.
    Pour ta réponse farscape je n'ai pas tout compris aurais-tu un liens pour un code etc que je puisse le décortiquer et voir un peu mieu comment on fait?

    Merci deja pour ces pistes

  5. #5
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    voila pour un dimensionnement en fin de resize de la fenetre:
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    /////////////////////////////////////////////////////////////////////////////
    LRESULT CResizeCListCtrlView::OnEnterSizeMove (WPARAM wParam, LPARAM lParam)
    {
        // les dimensions sont sauvegardées la premiere fois.
        if(!m_RectInitialWindow.Width())
        {
            // la taille de la fenetre.
            GetClientRect(m_RectInitialWindow);
            // la taill du controle
            m_ListCtrl.GetClientRect(m_RectInitialCtrl);
            ScreenToClient(m_RectInitialCtrl);
            // les colonnes du controle
            HDITEM hdi;
            hdi.mask = HDI_WIDTH;    
            for(int i=0;i<m_ListCtrl.GetHeaderCtrl()->GetItemCount();i++)
            {
                m_ListCtrl.GetHeaderCtrl()->GetItem(i,&hdi);
                m_arWithCol.Add(hdi.cxy);        
            }        
        }    
        return (LRESULT)0;
    }
    /////////////////////////////////////////////////////////////////////////////
    LRESULT CResizeCListCtrlView::OnExitSizeMove (WPARAM wParam, LPARAM lParam)
    {
     
        double dRatiox,dRatioy;
     
        CRect RectCtrl,RectWindow;
     
        // calcul des ratios pour le controle
        dRatiox=static_cast<double>(m_RectInitialWindow.Width())/static_cast<double>(m_RectInitialCtrl.Width());
        dRatioy=static_cast<double>(m_RectInitialWindow.Height())/static_cast<double>(m_RectInitialCtrl.Height());
     
        // ratios sur les colonnes.
        HDITEM hdi;
        hdi.mask = HDI_WIDTH;    
        CArray<double,double> arWitdthCol;
        for(int i=0;i<m_arWithCol.GetSize();i++)            
            arWitdthCol.Add(static_cast<double>(m_RectInitialCtrl.Width())/static_cast<double>(m_arWithCol[i]));
     
     
        // apres changement de taille.
        double nx,ny;
     
        GetClientRect(RectWindow);
        nx=static_cast<double>(RectWindow.Width())/dRatiox;
        ny=static_cast<double>(RectWindow.Height())/dRatioy;
     
        RectCtrl=m_RectInitialCtrl;
        RectCtrl.right=RectCtrl.left+static_cast<int>(nx);
        RectCtrl.bottom=RectCtrl.top+static_cast<int>(ny);
     
        m_ListCtrl.SetWindowPos(NULL,0,0,RectCtrl.Width(),RectCtrl.Height(),SWP_NOMOVE | SWP_NOZORDER); // uniquement la taille
     
        // dimensionnement des colonnes.
        for(i=0;i<m_ListCtrl.GetHeaderCtrl()->GetItemCount();i++)
        {
            nx=static_cast<double>(RectCtrl.Width())/arWitdthCol[i];
            hdi.cxy=static_cast<int>(nx);
            m_ListCtrl.GetHeaderCtrl()->SetItem(i,&hdi);
        }
     
        return (LRESULT)0;
    }
    ces messages doivent etre implementés sur la MDIchild pour un projet MDI ou la MainFrame pour un SDI.
    l'exemple :
    http://farscape.developpez.com/Sampl...eCListCtrl.zip

    bien sur c'est un exemple , a toi d'adapter en fonction de tes besoins...

  6. #6
    Futur Membre du Club
    Inscrit en
    Mars 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    merci permet moi de t'appeler MONSIEUR car le code explique bien comment cela se passe meme pour moi qui ne suis vraiment pas expert!!
    Me fera toujours rêver de taper des codes comme ca..
    Je me suis réorienté vers un template que j'ai trouvé dans la FAC :http://c.developpez.com/faq/vc/?page...#LayoutControl
    Car il fallait que je positionne en meme temps beaucoup de boutons,radiobuttons etc...
    J'arrive maintenant a positionner à peu prés l'ensemble,malgré quelques problémes comme éviter que mes deux CListCtrl ne s'agrandissent trop et qu'il y est des lignes vides!!!
    Mes deux listbox sont dans une groupe box alors en réfléchissant je me suis dit si je redimensionne le group box en fonction de la fenêtre je pourrais aprés redimensionner mes CListCtrl en fonction de la groupbox
    ce qui me donne en code:
    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
    
    CRect Rect;
    CRect Rect2(0,0,200,300);
    CWnd *pWnd = this;
    pWnd->GetWindowRect( &Rect );
    
     
    AddControl(IDC_STATIC,eSizeType::sizeResize,eSizeType::sizeResize);
    InitDialog(Rect,TRUE);
     
    CStatic* GroupBox;
    GroupBox = (CStatic*) GetDlgItem(IDC_STATIC);
     
    GroupBox ->GetWindowRect(&Rect2);
    
    AddControl(IDC_STATIC2,eSizeType::sizeNone ,eSizeType::sizeNone);
    AddControl(IDC_LIST1,eSizeType::sizeResize ,eSizeType::sizeResize);
    AddControl(IDC_STATIC3,eSizeType::sizeResize ,eSizeType::sizeResize );
    AddControl(IDC_LIST2,eSizeType::sizeResize ,eSizeType::sizeResize);
     
    
    InitDialog(Rect2,TRUE);
    
    Mais je dois faire une grosse betise il n'ya pas d'erreurs à la compil mais quand je lance(en mode debug) il me dit en gros:ASSERTION FAILED
    et op erreur
    et en mode release --->Prends pas en compte le Group Box et afficher sur toute la fenetre les CListCtrls!!!

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/07/2008, 12h58
  2. Réponses: 8
    Dernier message: 21/01/2008, 16h08
  3. redimensionnement d'une JWindow
    Par mbp566 dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 02/08/2002, 03h41
  4. Redimensionnement des Paquets IP sur un Réseau Local
    Par Bonoboo dans le forum Développement
    Réponses: 2
    Dernier message: 12/07/2002, 15h40
  5. Redimensionnement d'une surface
    Par Freakazoid dans le forum DirectX
    Réponses: 4
    Dernier message: 01/07/2002, 22h01

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