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
    Membre averti
    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
    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 : 39
    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
    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 Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 412
    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
    Membre averti
    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
    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
    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
    Membre averti
    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
    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 �prouv�
    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 : 54
    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
    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
    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 Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 412
    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 Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 412
    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