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

C++Builder Discussion :

Scintillement des contrôles du à un redimensionnement


Sujet :

C++Builder

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 28
    Points : 25
    Points
    25
    Par défaut Scintillement des contrôles du à un redimensionnement
    Bonjour,

    Sur l'évenement OnResize de ma Form, j'appelle une fonction que j'ai crée qui me permet de redimensionner à la volée chaque contrôle posé sur ma fiche (en fonction du ratio résolution execution/resol origine) ...

    Le traitement de redimensionnement est d'autant plus long que j'ai instauré certaines règles (par exemple un TEdit ne se redimensionne qu'en largeur etc..). Ce traitement est également d'autant plus long si un nombre conséquent de contrôles sont posés sur la fiche.

    Mon problème est que mes composants scintillent à l'écran lorsque l'utilisateur redimensionne la fenêtre ... Or, je voudrais éviter ce clignotement du au redimensionnement ...

    Je suis conscient que mon redimensionnement et le réalignement de mes composants ne peut pas être immédiat, mais j'aimerais éviter que l'utilisateur voit défiler et clignoter les contrôles...

    J'ai bien essayé d'utiliser la fonction de l'API LockWindowUpdate sur le Handle de ma fenetre, juste avant d'appeler ma fonction de redimensionnement, mais je ne vois aucune amélioration.

    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void __fastcall TfrmMaForm::FormResize(
          TObject *Sender)
    {
            LockWindowUpdate(this->Handle);
            MaFonctionDeRedimensionnement();
            LockWindowUpdate(0);
    }
    Merci d'avance pour vos idées qui sont les bienvenues !

  2. #2
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut Ju2Pom,

    Je ne sais pas si tu l'as déjà fait ou si ça changera quelque mais tu peux essayer de mettre ceci sur le Create de ta form :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1->DoubleBuffered=true;
    Je ne suis pas trop calé la dessus, donc je ne peux que te soumettre cette proposition ...

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    Si ce repositionnement agit sur les 4 propriétés séparément (Left, Top, Width et Height) sur chacun des contrôles, dans ce cas on va y gagner en utilisant la méthode SetBounds pour chacun d'eux.

    A plus !

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 28
    Points : 25
    Points
    25
    Par défaut
    Merci à vous deux pour vos réponses !
    Effectivement je ne connaissais pas la méthode SetBounds

    Néanmoins j'ai toujours des scintillements, et j'aimerais pour cela effectuer le redimensionnement de mes composants non pas à la volée lors des multiples appels à la fonction OnResize de ma Form, mais une seule et unique fois !

    Je m'explique : j'aimerais appeler ma fonction de redimensionnement non pas lorsque l'utilisateur enfonce le bouton gauche de la souris et redimensionne la fenêtre (soit par le grip d'une status bar placée en bas de ma fenêtre, soit par les bords de la fenêtre...) ; mais appeler mon traitement de redimensionnement lorsque l'utilisateur RELACHE LE BOUTON GAUCHE de la souris !!

    Ainsi les calculs de realignement/redimensionnement ne seront effectués qu'une seule fois !

    Le problème étant que je n'arrive pas à catcher dans l'evenement OnResize de ma form l'état actuel du bouton gauche de la souris (enfoncé, relâché ...)

    J'ai bien essayer d'intercepter les messages windows en déclarant ceci dans mon .h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            MESSAGE void __fastcall OnMouseUp(TMessage &Message);
            BEGIN_MESSAGE_MAP
            MESSAGE_HANDLER(WM_LBUTTONUP, TMessage, OnMouseUp);
            END_MESSAGE_MAP(TForm);
    Mais je ne rentre jamais dans la fonction OnMouseUp de mon .cpp ...

    Merci pour vos idées ...

  5. #5
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut Ju2Pom:
    Tu ne peut pas detecter directement comme tu le fait le relachement du boutton, il faut ruser, tu peut le detecter dans le MouseDown puisque tu a appuye tu va relacher
    Soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void __fastcall TForm1::Button1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    while((GetAsyncKeyState(VK_RBUTTON) & 0x8000) != 0)
    {
     ShowMessage("Boutton gauche");
    }
    }
    Ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void __fastcall TForm1::Button1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    if((GetAsyncKeyState(VK_RBUTTON) & 0x8000) != 0)
    {
     ShowMessage("Boutton gauche");
    }
    }
    Je te conseille vivement de lire le tuto sur les fonction claviers souris

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 28
    Points : 25
    Points
    25
    Par défaut
    Merci Blondelle mais le problème est que je ne rentre même pas dans l'evenement OnMouseDown de ma Form lorsque je clic sur la bordure droite permettant de la resizer ...

    D'aileurs je n'y rentre pas non plus lorsque je clique au sein de ma fenêtre elle-même ... Car je pense que ceux sont les panels qui sont posés dessus intercepte l'évenement ...

    Du coup je suis bien embêté ...

  7. #7
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonjour,

    Pour ce qui est du clic sur les bordures (si je comprends bien), pour ma part je dirais qu'il te faut alors gérer les messages dans la zone 'non-cliente' de la fenêtre.
    C'est a dire, dans le .h de la form, rajouter des gestionnaires pour les évènements en question avec BEGIN_MESSAGE_MAP et compagnie.
    Il te faut chercher aussi donc du côté des évèments du type WM_NCLBUTTONUP, afin de pouvoir travailler dessus.
    Donc voir dans l'aide Win32 SDK, ou une recherche ici car ce genre de choses a très certainement déja été évoqué.

    En espérant t'aider,
    @+
    vinc

  8. #8
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Et bien pour ma part je ferais un teste sur " OnMouseDown " sur chaqu'un des composants pose sur la Form afin de savoir le ou les quels interceptent cet evenement, que je redirigerais vers une fonction de traitement
    Je viens de me rendre compte que j'ai inverse " VK_RBUTTON " avec " VK_LBUTTON " dans le code, le teste est sur le boutton droit et non sur le gauche desole

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    Il s'agirait de savoir s'il y a une grande densité de contrôles sur la fenêtre.
    A noter qu'il existe DisableAlign (lock) et EnableAlign (unlock).
    Par ailleurs, je me suis amusé à développer une classe pour réaliser ce redimensionnement (sans pertes d'infos).
    Je n'ai pas de problèmes de scintillement malgré le matériel dont je dispose, avec 5 Panels et 5 Edits.
    Donc, au cas où, je peux tester avec plus...
    Pour finir, le OnResize n'est effectif que lorsque l'on relâche le bouton (en tout cas chez moi) donc...

    A plus !

  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    Je n'ai pas eu trop le temps de bosser dessus, mais voici une base.
    On va intercepter deux messages et agir en conséquence :

    WM_ENTERSIZEMOVE : le resize/move débute (mouse down)
    WM_EXITSIZEMOVE : fin du resize/move (mouse up ... ce qui semble être convoité ici)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    On déclare ceci dans la classe de la form :
     
    protected:
      void __fastcall WMEnterSizeMove(TMessage &Message);
      void __fastcall WMExitSizeMove(TMessage &Message);
    BEGIN_MESSAGE_MAP
      MESSAGE_HANDLER(WM_ENTERSIZEMOVE, TMessage, WMEnterSizeMove)
      MESSAGE_HANDLER(WM_EXITSIZEMOVE, TMessage, WMExitSizeMove)
    END_MESSAGE_MAP(TForm)
    J'ai utilisé comme ceci :

    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
     
    bool IsSizing = false;
     
    void __fastcall TForm1::WMEnterSizeMove(TMessage &Message)
    {
    IsSizing = true; // on va interdire de redimensionner les objets
    }
     
    void __fastcall TForm1::WMExitSizeMove(TMessage &Message)
    {
    IsSizing = false; // on peut redimensionner les objets
    FormResize(this); //ce qu'il faut évidemment faire !
    }
     
    void __fastcall TForm1::FormResize(TObject *Sender)
    {
    if(IsSizing) return;
    DisableAlign();
    //...le code pour redimensionner les objets
    EnableAlign();
    }
    Le problème pour l'instant est l'apparition des scrollbars de la fenêtre (pendant la réduction de taille)... mais ça devrait se résoudre...

    A plus !

Discussions similaires

  1. Redimensionnement dynamique des fiches et des contrôles
    Par patrickluk dans le forum Composants VCL
    Réponses: 3
    Dernier message: 12/07/2014, 17h22
  2. [XL-2003] Redimensionnement des contrôles
    Par Cocotte278 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/11/2011, 16h02
  3. redimensionnement des contrôles
    Par xsaami dans le forum Windows Forms
    Réponses: 1
    Dernier message: 20/05/2008, 16h11
  4. ID des contrôles
    Par Monstros Velu dans le forum MFC
    Réponses: 5
    Dernier message: 08/12/2003, 09h10
  5. Réponses: 5
    Dernier message: 13/11/2003, 16h57

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