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

Turbo Pascal Discussion :

[BPW] Affichage clignotant lors de redimensionnement fenêtre


Sujet :

Turbo Pascal

  1. #1
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 967
    Points : 59 729
    Points
    59 729
    Billets dans le blog
    2
    Par défaut [BPW] Affichage clignotant lors de redimensionnement fenêtre
    Bonjour à toutes et tous !

    La zone client d'une fenêtre enfant est entièrement remplie par une ListBox à plusieurs colonnes. Les éléments de cette ListBox sont dessinés par mon programme (messages wm_DrawItem).

    A chaque redimensionnement de la fenêtre, mon programme intercepte les messages wm_Size de manière à adapter la largeur des colonnes à la largeur de la fenêtre.

    Tout fonctionne bien sauf que, lors du redimensionnement de la fenêtre, les réaffichages successifs de la ListBox provoquent un effet visuel désagréable, une sorte de "clignotement" de la fenêtre.

    Je n'ai pas la moindre idée de la manière dont je pourrais éviter cet inconvénient. Quelqu'un(e) aurait-il(elle) une idée ?

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Citation Envoyé par Alcatîz
    Tout fonctionne bien sauf que, lors du redimensionnement de la fenêtre, les réaffichages successifs de la ListBox provoquent un effet visuel désagréable, une sorte de "clignotement" de la fenêtre.
    Euh simple question : combien de fois la ListBox s'affiche ? Sinon je ne vois pas de solution aux premiers abords... Désolé...

    a+

  3. #3
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 967
    Points : 59 729
    Points
    59 729
    Billets dans le blog
    2
    Par défaut
    Merci pour ta réponse rapide (comme d'habitude) !

    Un réaffichage a lieu à chaque fois qu'un message wm_Size est intercepté. Donc, c'est rapide et ça dure jusqu'à ce que le bouton de la souris soit relâché.

    L'idéal serait un message qui indiquerait que la fenêtre a été redimensionnée. J'indague du côté de wm_NCCalcSize mais c'est assez ardu.

  4. #4
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Tu peux peut-être tourner le problème dans l'autre sens en ne réaffichant ta fenêtre seulement quand l'utilisateur ne la redimensionne plus (je pense que tu as sûrement dû y réfléchir !).
    Dans l'aide de Delphi, j'ai également trouvé un évènement WM_SIZING, qui est envoyé à la fenêtre quand l'utilisateur est en train de la redimensionner. On peut envisager un algorithme du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Tant que je reçois WM_SIZING
    je ne réaffiche pas la fenetre
    fin Tant que
    j'affiche la fenêtre
    Voilà c'est juste une piste, mais je n'en sais pas plus pour l'instant !
    a+

  5. #5
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 967
    Points : 59 729
    Points
    59 729
    Billets dans le blog
    2
    Par défaut
    Yo, voilà ce qu'il me faut : une autre manière d'approcher le problème.

    Il est probable que le wm_Sizing de Delphi et le wm_Size de BPW soient de très proches parents.

    Quoi qu'il en soit, il est plus difficile de tester un non-événement qu'un événement. Mais je vais m'y pencher.

  6. #6
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Tu peux lancer un timer, mais ça bouffe des resources... Tant qu'un WM_SIZE est envoyé, tu remets un compteur un zéro, et dès que le compteur atteint une certaine valeur (incrémentée dans le timer), c'est le bon moment.


    Mais dis moi, tu ne peux pas dessiner sur un buffer ? C'est généralement ce qui est utilisé pour éviter les effets de scintillement.

    A+

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Points : 67
    Points
    67
    Par défaut
    J'ai eu ce souci avec le soft ou je t'ai envoyé un screen !!
    pour le résoudre facile !!!
    ds Wm_size, j'ai mis un invalidaterect (handlelist_box, nil,false);
    ensuite ds wm_drawitem:

    je dessine tout ds un bitmap que je cree,
    ensuite j'affiche sur le HDC, ainsi, les effacements n'apparaissent pas, puisque tu viens reafficher directement sur ton ancienne zone !!!

    j'espere t'avoir aider !!!

  8. #8
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 967
    Points : 59 729
    Points
    59 729
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par mennix
    je dessine tout ds un bitmap que je cree
    Veux-tu dire que tu sélectionnes une bitmap vierge dans un MemDC, que tu y dessines l'élément de la ListBox et que tu transfères enfin le contenu du MemDC dans le DC de la ListBox ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Points : 67
    Points
    67
    Par défaut
    Tout a fait,

    tu crees un CreateCompatibledc dans memdc;
    puis un CreateCompatibleBitmap , sa taille ->Rcitem.bottom et rcitem.Right
    puis enfin, tu selectionnes l'object
    bmpvierge:=selectobject(memdc, bmpvierge)

    ensuite tu dessines, sur Memdc
    a la fin, un petit BitBlt (copier le contenu de memdc sur Hdc)
    et enfin liberer l'object bmpvierge

    et voila !!!

  10. #10
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 967
    Points : 59 729
    Points
    59 729
    Billets dans le blog
    2
    Par défaut
    Aargh ! L'effet de clignotement persiste !
    J'y croyais, pourtant...

    En testant et re-testant, j'ai constaté que le clignotement ne se produisait pas sur tous les OS :

    - Windows 3.11 : pas de clignotement;
    - Windows 98 SE : pas de clignotement;
    - Windows NT 4.0 SP 4 : clignotement;
    - Windows NT 4.0 SP 6 : pas de clignotement;
    - Windows 2000 Pro SP 2 : clignotement.
    - Windows 2000 Pro SP 4 : clignotement.

    : :

    Les OS "non clignotants" n'envoient le message wm_Size qu'au relâchement de la souris et les "clignotants" à chaque message wm_MouseMove.

  11. #11
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Merci Monsieur Gates...

Discussions similaires

  1. Réponses: 5
    Dernier message: 30/08/2013, 10h09
  2. Réponses: 3
    Dernier message: 18/05/2008, 18h39
  3. Réponses: 1
    Dernier message: 03/03/2008, 09h21
  4. Clignotement lors des redimensionnements
    Par TSalm dans le forum Général Dotnet
    Réponses: 6
    Dernier message: 07/12/2007, 23h08
  5. Problème d'affichage lors du redimensionnement
    Par sidi.elmoctar dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 12/04/2006, 08h44

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