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
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    16
    D�tails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 16
    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 actuellement connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 299
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 4 299
    Billets dans le blog
    2
    Par d�faut
    Salut,

    pourquoi n'utilises-tu pas SetWindowPos()?

  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,

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