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

VB 6 et antérieur Discussion :

vitesse de déplacement d'une image pas constante


Sujet :

VB 6 et antérieur

  1. #1
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    513
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 513
    Points : 127
    Points
    127
    Par défaut vitesse de déplacement d'une image pas constante
    bonjour à tous
    j'essaye de faire défiler des photo sur mon écran d'ordinateur.
    j'ai donc essayé le code qui suit,
    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
     
        Case 5 'coin supérieur gauche
            DepX = -LpicsP'largeur de l'image
            DepY = -HpicsP'hauteur
            deltax = ((DepX - gauche)) / Vit'vitesse déplacement ici à 800
            deltay = ((DepY - supérieur)) / Vit
            With Picture1'conteneur qui à reçu la photo
                .Move DepX, DepY
                .Visible = True
            End With
            Form1.BackColor = &H8000000F
            Form1.Refresh
            mvX = DepX
            mvY = DepY
            'début du déplacement
            Do Until mvX >= gauche Or mvY >= supérieur
                mvX = Picture1.Left - deltax
                mvY = Picture1.Top - deltay
                Picture1.Move mvX, mvY
                cpte = cpte + 1 'compteur pour accélérer la vitesse sur la fin
                If cpte = Vit Then cpte = Vit - 1
    'ici réintroduction possible du calcul du delta car la valeur ne tombe _
     toujours sur une valeur(je pense) de déplacement possible
                'deltax = (Picture1.Left - gauche) / (Vit - cpte) 'calcule le delta en fonction de la distance restante _
                                                                'permet d'arrivée plus près du point final
                'deltay = (Picture1.Top - supérieur) / (Vit - cpte)
                'refresh'avec refresh l'avancée est légèrement sacadée
                DoEvents
            Loop
            Picture1.Move gauche, supérieur'pour bien mettre la photo _
    à l'endroit voulu
    mais problème le déplacement n'a jamais une vitesse "visuellement" constante! Je ne sais si cela provient de la taille des photos, bien que l'effet ne soit pas toujours identique avec des mêmes photos, ou si cela provient du Doevents incorporé dans la boucle? dont d'ailleur j'ai du mal à bien comprendre le fonctionnement (du Doevents)


    est ce que quelqu'un pourrait m'expliquer ce qui se passe

    merci d'avance
    [/code]

  2. #2
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Utilises un Timer !
    C'est fait pour cà !

  3. #3
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    513
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 513
    Points : 127
    Points
    127
    Par défaut
    merci pour ta prompte réponse
    j'ai donc essayé un timer( que tu m'avais déjà recommandé) mais apparement pas d'amélioration si ce n'est un ralentissement je te resoumets ce bout de 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
     
        Case 5 'coin supérieur gauche
            DepX = -LpicsP
            DepY = -HpicsP
            deltax = ((DepX - gauche)) / Vit
            deltay = ((DepY - supérieur)) / Vit
            With Picture1
                .Move DepX, DepY
                .Visible = True
            End With
            Form1.BackColor = &H8000000F
            Form1.Refresh
            mvx = DepX
            mvy = DepY
     
                Do Until mvx >= gauche Or mvy >= supérieur
                Timer1.Enabled = True
                DoEvents
                Loop
                cpte = 0
                Timer1.Enabled = False
            Picture1.Move gauche, supérieur
    Private Sub Timer1_Timer()
    'début du déplacement
    mvx = Picture1.Left - deltax
    mvy = Picture1.Top - deltay
    Picture1.Move mvx, mvy
    cpte = cpte + 1 'compteur pour accélérer la vitesse sur la fin
    If cpte = Vit Then cpte = Vit - 1
    'deltax = (Picture1.Left - gauche) / (Vit - cpte) 'calcule le delta en fonction de la distance restante _
    permet d'arrivée plus près du point final
    'deltay = (Picture1.Top - supérieur) / (Vit - cpte)
    'refresh'avec refresh l'avancée est légèrement sacadée
    'DoEvents

    End Sub
    je ne sais si j'utilise correctement le timer

    mais le mouvement parrait très lent, accélère, redevient lent pour accélérer enfin!!
    est ce que ce ne pourrait pas provenir de mon micro , de son occupation? j'ai essayé en ne faisant tourner que mon appli toujours le m^me

  4. #4
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Heu !....
    il y a là plusieurs paramètres dont la présence me surprend (la variable vit entre autres...)
    Alors :
    1) dis-moi ce que tu as sur ta Form... Une pictureBox, apparemment .
    2) dis-moi ce que tu veux que cette picturebox fasse (chemin)

    Je préfère partir de ces simples indications ...

    Une autre chose : quel "poids" ont tes photos successives ? (il faut en effet le temps de les charger... et les doevents vont ici et là ... provoquer des occupations du système... et du temps !
    Je veux tout savoir !

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Citation Envoyé par L'aide
    DoEvents : Arrête momentanément l'exécution afin que le système d'exploitation puisse traiter d'autres événements.
    Tu en as besoin quand certaines opérations solicitent le système, ouverture/enregistrement/fermeture de fichier, mise à jour de l'affichage, etc.
    Certaines de ces opérations étant assumées facilement par le système, si DoEvents est "oublié", on ne s'en aperçoit pas mais dans d'autre cas, si...
    Pour ton pb, comme tu utilises apparemment qu'une seule image, peut-être le temps de calcul interfère-t-il (?) Essaie tes déplacements avec des constantes calculées par avance, tu verras bien si c'est ça...

    A+

  6. #6
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    513
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 513
    Points : 127
    Points
    127
    Par défaut
    merci de ta réponse
    mais apparementce n'est pas les calculs dans la boucle d'affichage (j'ai essayé avec des valeurs fixes)
    lorsqu'on ne mets pas doevents ou refresh le déplacement est hyper rapide si bien qu'on ne le voit pas on voit immédiatement l'image à sa position finale
    j'ai essayé de mesurer le temps de déplacement avec gettikcount dans un tableau mais apparement les valeurs sont pas régulière et des fois à 0
    merci encore

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Tu déclares
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    et tu utilises
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sleep 5 ' ou 10 ou 11... ^^
    après chaque affichage, à la place de DoEvents

    Tu essaies et tu nous dis

    A+

  8. #8
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    J'y perds mon latin !
    Il y a un timer... et il sert à quoi, alors ?
    Il s'agit d'une opération simple !

    par contre, ce qui devrait venir ensuite (je le sens venir) l'est moins (simple) car :
    j'essaye de faire défiler des photo sur mon écran d'ordinateur.
    laisse bien présager une succession de photos (par un click sur un bouton, surement...)
    La "promenade" de chacune des photos me parait une chose élémentaire.
    Ce qui va l'être moins (mais assez facile quand même en utilisant l'arithmétique), c'est l'ajustement par étirement proportionné de chacune de ces photos (qui n'auront pas forcément toutes les mêmes rapports largeur/hauteur)...
    Il va également falloir profiter du "temps d'admiration" de la beauté de chaque photo (donc entre un click et l'autre) pour charger sans attendre, en catimini, la photo suivante (voire les 2 photos suivantes). Tout celà pour éviter, après un click, les lenteurs, variables, des différents chargements successifs. Tout celà se gère ....

  9. #9
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Bon Marco ! je commence à deviner l'effet que tu veux obtenir, mais, avant de développer, j'aimerais que tu sois clair sur certains points :
    1) la cinétique des déplacements de ta photo, depuis le départ jusqu'à la fin (avec description de l'évolution de la vitesse, des arrêts éventuels, etc...)
    2) comment déclenches-tu un départ (bouton de commande ?)
    3) à la disparition de la photo : une autre photo (la suivante) doit-elle être affichée à son tour, avec le même déplacement que la précédente ? Et si oui : dans quoi exactement sont stockés les chemins d'accés des photos successives (un répertoire? une liste ?...) ?
    4) les proportions hauteur/largeur de tes photos (si plusieurs) sont-elles toujours les mêmes ou peuvent-elles varier (en te rappelant que 2 photos de même surface mais l'une présentée en hauteur et l'autre en largeur n'ont pas le même rapport hauteur/largeur)
    Toutes ces questions car je vois bien où tu veux en venir (je le vois depuis ton sujet précédent) et, développer pour développer, j'aime autant le faire en connaissance de cause pour éviter d'en arriver, plus loin, à tout refaire ou à continuer avec l'existant et construire une usine à gaz !
    Alors et pour finir : si tu veux mon aide : oui , mais à la condition que l'on se jette ensemble en avant pour ne pas retomber en arrière ! sinon : non !

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Je prends l'exemple avec sleep : Pour accélérer le déplacement, au lieu de jouer sur Vit, tu peux jouer sur le Tps d'affichage ou les deux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            Délai = 1000 le temps max que dureras ton déplacement + un chouilla) ***
            Tps = 50 '*
            Do Until mvX >= gauche Or mvY >= supérieur 
                Délai = Délai - Tps
                mvX = Picture1.Left - deltax 
                mvY = Picture1.Top - deltay 
                Picture1.Move mvX, mvY 
                'cpte = cpte + 1 'compteur pour accélérer la vitesse sur la fin 
                'If cpte = Vit Then cpte = Vit - 1 
                Sleep Délai
            Loop
    Tu devras ajuster le Délai de départ et la valeur de Tps mais tu devrais y parvenir

    Tu dis

    A+

  11. #11
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Bon, marco...
    J'ai commencé de telle façon que nous pourrons ensuite adapter à un album déroulant sans faire d'usine à gaz...
    alors :

    dans une "Form" :
    un cadre carré appelé Frame1 (aux dimensions (taille d'affichage) que tou voudras, mais carré !
    dans ce cadre frame1, une image image1, aux dimensions que tu voudras (peu importe puisque le programme ajustera) avec la propriété picture = ta photo
    ailleurs sur la Form (ou tu voudras et minuscule si tu veux)une image image2
    ailleurs sur la Form (ou tu voudras car j'ajuste ensuite) : un bouton command1
    où tu voudras : un timer timer1
    le temps d'exposition est fixé par exposeconds (ici 3 mais tu peux modifier comme tu l'entends)

    le tout avec ce 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
    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
    Private centre As Integer
    Private zou As Integer
    Private jmf As Boolean
    Const exposeconds = 3
    Private Sub Command1_Click()
    Dim rapfin As Single
     Image2.Picture = Image1.Picture
     If Image2.Height >= Image2.Width Then
       rapfin = Image2.Width / Image2.Height
       Image1.Height = Frame1.Height
       Image1.Width = Frame1.Height * rapfin
     Else
       rapfin = Image2.Height / Image2.Width
       Image1.Width = Frame1.Width
       Image1.Height = Frame1.Width * rapfin
     End If
     Image1.Left = (Frame1.Width - Image1.Width) / 2
     Image1.Top = (Frame1.Height - Image1.Height) / 2
      Frame1.Left = Me.Width
      zou = Int(centre / 20)
      If Timer1.Enabled = True Then
        Timer1.Enabled = False
      Else
       Timer1.Enabled = True
      End If
    End Sub
     
    Private Sub Form_Activate()
      centre = Int((Me.Width - Frame1.Width) / 2)
      With Frame1
        .Top = Int((Me.Height - Frame1.Height) / 2)
        .Left = Me.Width
        .Caption = ""
        .BorderStyle = 0
      End With
      Image1.Stretch = True
      image2.visible = false
      Command1.Caption = "envoyer photo"
      Command1.Move (Me.Width - Command1.Width) / 2, Me.Height - (Command1.Height * 2)
    End Sub
     
    Private Sub Timer1_Timer()
     Dim coucou As Integer, depart As Double
     coucou = 1
     Frame1.Left = Frame1.Left - zou
     zou = zou + coucou
     coucou = coucou + 20
     If Frame1.Left <= centre And jmf = False Then
       Timer1.Enabled = False
       depart = Timer
       While Timer < depart + exposeconds
       Command1.Visible = False
         DoEvents
       Wend
       jmf = True
     End If
     Timer1.Enabled = True
     If Frame1.Left < Me.Left - (Frame1.Width * 2) Then
       Timer1.Enabled = False
       jmf = False
       Command1.Visible = True
     End If
    End Sub
    Tu cliques.... vois dérouler de plus en plus vite.... s'arrêter au centre pendant 3 secondes....(pendant cet arrêt, ton bouton disparaît).... puis s'enfuir de plus en plus vite jusqu'à disparaître....
    Le bouton réapparaît alors et tu peux recommencer... autant de fois que tu veux ... jusqu'à t'en lasser
    EDIT : il est bien clair que toutes les propriétés ici définies dans Form_activate peuvent l'êtren, avantageusement, en dur dans la fenêtre des propriétés... et le que "code", donc, s'en trouvera considérablement réduit... l'essentiel à retenir n'étant que ce qui se trouve dans l'événement Timer et les ajustements proportionnels d'images .....

  12. #12
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    513
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 513
    Points : 127
    Points
    127
    Par défaut
    bonjour à tous et merci à vous deux pour vos réponses

    à ouskel'nor
    j'ai fait énormément d'essais dans le déplacement d'une grande photo.
    il faut obligatoirement insérer dans la boucle de déplacement un "Doevents ou Refresh de la Form" sinon l'image n'est pas visible on voit simplement des bordures noires se déplacer!
    la fonction sleep interrompt le micro mais ne permet pas l'affichage!
    Donc lorsqu'on déplace un conténaire type picture box doevents suffit pour afficher l'image et la ralentir suffisamment pour la voir défiler (2 secondes pour faire une diagonale d'un écran 19").
    Tandisque lorsque j'ai fait comme si un volet se déplacer et laissait apparaitre la photo en copiant ligne par ligne la photot sur la Form, alors là l'effet est très rapide et il faut que je mette un ralentisseur dans la boucle !

    à jmfmarques
    en fait j'ai déjà réglé la plus part des problèmes que tu évoques.
    je fait un écran de veille avec mon album photo.
    j'ai commencé par régler le problème d'avoir des photos aléatoires et pas toujours les mêmes, donc dans un fichier texte contenant le DIR de mon répertoire je vais chercher aléatoirement la photo et je la suprime de la liste pour ne pas la reprendre ensuite.
    après j'ai fait le calcul de la photo à afficher en la chargeant dans un picturebox à Autosize à true pour obtenir la taille de la photo exacte, j'ai calculé le rapport pour qu'il s'affiche sur un maximum de mon écran.
    Et après j'ai créer les déplacement des transitions en déplaçant le picture box avec la photo dessinée dessus. ET d'autres effets de dévoilement de l'image là en copiant ligne par ligne sur la form,.
    Je suis arrivé à 20 sortes de transition.


    à tous

    lorsqu'on fait des déplacements avec move X+detax, Y+deltay les delta de déplacement ne sont pas toujours bien pris en compte ex un déplacement de 1.24 se retrouve avec un déplacement de 1.2667 j'ai vérifié les valeurs en relevant les valeurs left et top après les déplacements.
    Donc qu'est ce que ça veut dire une valeur en simple précision??

  13. #13
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    ex un déplacement de 1.24 ]
    Tu es en quel scalemode ?
    Essayes donc ce que je t'ai passé !
    Tes photos auront toujours la même taille, dans le même cadre, et défileront normalement

Discussions similaires

  1. Déplacement d'une image dans un CStatic
    Par homeostasie dans le forum MFC
    Réponses: 2
    Dernier message: 08/03/2007, 18h36
  2. déplacement d'une image dans un calque dimensionné précis
    Par mimix0 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/09/2006, 18h03
  3. [CSS] Déplacement d'une image...
    Par S~C dans le forum Mise en page CSS
    Réponses: 12
    Dernier message: 13/05/2006, 06h58
  4. [VB.NET] Déplacement d'une image
    Par ludovic85 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 01/02/2005, 13h07
  5. Vitesse de chargement d'une image jpg ?
    Par ybruant dans le forum Langage
    Réponses: 6
    Dernier message: 16/11/2004, 21h42

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