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] OnResize et Controles


Sujet :

MFC

  1. #1
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    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 288
    Billets dans le blog
    2
    Par défaut [MFC] OnResize et Controles
    Bonjour à tous,

    voilà, j'ai une boite de dialog (qui hérite de CDialog) qui contient quelques controles (boutons, edits etc.) Et je souhaite organiser ces controles de façon dynamique, en fonction de la taille la boite de dialogue.

    Pour ce faire, j'aimerais placer mon code dans le OnSize() de ma dialog. Le principe est le suivant: j'ai un controle qui ne bouge pas (que j'appelerais control1), et la position des autres (control2, control3, etc.) doit être calculée en fonction de celui-là. J'ai donc tenté de faire ça (le code suivant est censé positionner le control2 en dessous de control1):
    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
    void CBEMainDialog::OnSize(UINT nType, int cx, int cy) 
    {
             if (::IsWindow(control1.m_hWnd) && ::IsWindow(control2.m_hWnd))
            {
                // le récupère la position du control1 (mon "repère")
                LPRECT lpRect1;
                control1.GetClientRect(lpRect1);
     
                // je récupère la position du control2 (j'en ai besoin car je souhaite conserver sa hauteur)
                LPRECT lpRect2;
                control2.GetClientRect(lpRect2);
     
                //je positionne contol2 en dessous de control1
                control2.SetWindowPos(  NULL, 
                                        lpRect1->left, 
                                        lpRect1->bottom,
                                        lpRect1->right - lpRect1->left,
                                        lpRect2->bottom - lpRect2->top,
                                        SWP_SHOWWINDOW);
            }
        }
    }
    Et là,
    1/ ça plante direct lorsque la fenêtre s'affiche, à la ligne control2.GetClientRect(lpRect2); Ce qui est étrange c'est que le GetClientRect précédent (sur l'autre controle) est passé.
    2/ le contenu de lpRect1 est totalement erroné.

    Visiblement, le OnSize est appelé alors que les controles ne sont même pas encore définis ou quelque chose comme ça. Pourquoi les m-hWnd respectifs de mes controles ne sont pas = à 0x0000000 et que ça plante quand même? Comment faire pour contourner cela?

  2. #2
    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 ,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CRect rect; 
    GetClientRect(&rect);
    LPRECT c'est un pointeur tu lui transmets un pointeur pas l'adresse d'un objet ...
    bon ensuite tu as un exemple de layout dans la faq et
    voir ce post parce que ta méthode n'est pas correcte sur les coordonnées:
    http://c.developpez.com/faq/vc/?page...ontrolInWindow

  3. #3
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    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 288
    Billets dans le blog
    2
    Par défaut
    ok

    cependant, il se passe quelque chose d'étrange, voici mon nouveau code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CRect rect1;
                control1.GetClientRect(&rect1);
     
                control2.SetWindowPos(    NULL, 
                                            rect1.left, 
                                            rect1.bottom + 10,
                                            rect1.Width(),
                                            m_iHeightControl1,
                                            SWP_SHOWWINDOW);
    Et en fait, mes 2 controles ne sont pas vraiment alignés. control2 est quelques pixels plus à gauche que control1 et il est un tout petit peu plus court en largeur. Comment se fais-ce? Est-ce une histoire de "window edge"?

  4. #4
    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
    possible, de plus tu utilises GetClientRect ,alors que c'est GetWindowRect qu'il faut utiliser et faire le ScreenToClient comme dans la faq..

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    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 288
    Billets dans le blog
    2
    Par défaut
    Aarrrgh, j'avais pas vu que c'était GetWindowRect à la place de GetClientRect, du coup je ne voyais pas l'utilité du ScreenToClient

    Si vous me cherchez, je suis en train de faire 100 pompes et je cherche mes cours de c++...


    encore

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/06/2006, 14h47
  2. [MFC] updater un control sans les updater tous
    Par zzorglub dans le forum MFC
    Réponses: 4
    Dernier message: 14/02/2006, 17h06
  3. Réponses: 3
    Dernier message: 22/12/2005, 10h43
  4. [MFC] redimensionner un controle
    Par benahpets dans le forum MFC
    Réponses: 5
    Dernier message: 01/09/2005, 17h06
  5. [MFC]gestion du controle MaskedEdit
    Par dj_kyl dans le forum MFC
    Réponses: 2
    Dernier message: 27/11/2003, 19h58

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