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 :

[VB]déplacement d'un controle image avec la méthode move


Sujet :

VB 6 et antérieur

  1. #1
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    504
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 504
    Points : 125
    Points
    125
    Par défaut [VB]déplacement d'un controle image avec la méthode move
    bonjour à toutes et tous
    je veux faire un écran de veille qui affiche toutes mes photos de vacances.lorsque je veux faire des transitions d'image(.jpg) j'utilise un controle image et la propriété move.
    premièrement le déplacement n'est pas très fluide!
    deuxièment si je fais apparaitre l'image dans le coin inférieur droit, que je fait progresser la photo vers le coin supérieur gauche, ça va bien tant que la largeur de la photo (largeur inférieure à la largeur totale de l'écran et inférieure à la hauteur) donc quand le bord droit de la photo passe le bord droit de l'écran et continue sa progression l'image saute
    essayé ce code pour mieux voir avec une image plus haute que large
    x et y sont les positions finales ducoin supérieur gauche de la photo
    Sub inf_dr_sup_ga(vue As Image, ByVal x As Integer, ByVal y As Integer)

    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
    Dim L, H
    Dim vit
    vit = 50 'vitesse de déplacement
     
    L = Screen.Width
    H = Screen.Height
    deltay = (H - y) / vit
    deltax = (L - x) / vit
     
    Do While L > x
    vue.Move L, y ' H
    L = L - deltax
    H = H - deltay
    Loop
    vue.Move x, y
     
    End Sub
    si quelqu'un à une explication ou une meilleur méthode pour déplacer des images

    merci d'avance

  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
    Essaye d'être plus précis sur la trajectoire car le la vois mal.

    Que veux-tu faire exactement :
    1) partir du coin inférieur droit pour aller, en diagonale, vers le coin supérieur gauche ?
    2) parir du coin inférieur droit, glisser verticalement vers le haut jusqu'au bord supérieur droit puis glisser vers la gauche jusqu'à atteindre le coin supérieur gauche ?
    maintenant en lisant celà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    L = Screen.Width
    H = Screen.Height
    deltay = (H - y) / vit
    deltax = (L - x) / vit
     
    Do While L > x
      vue.Move L, y ' H
      L = L - deltax
      H = H - deltay
    Loop
    vue.Move x, y
    1) Le 1er déplacement de ton image est tel qu'elle aura complètement disparu de l'écran, puisque L est alors = largeur de l'écran et que y est encore = 0 (et ceci que ton image soit plus large que haute ou plus haute que large). Il te faut prendre en considération la largeur de ton image si tu veux qu'elle reste visible lors de ce 1er "trajet"

    2) donner à L et H les dimensions de l'écran ne me parait pas une bonne idée ! Il vaut mieux leur donner les dimensions de ta Form et, dans l'évènement activate de cette dernière, lui donner, à elle, les dimensions de ton écran ... cette manière t'évitera bien des calculs !

    3) une boucle de déplacement donnera toujours une image saccadée... et la vitesse, dépendant alors directement de ta machine, sera variable sur ta machine et pourra être très différente d'une machine à l'autre !

    Comme tu ne dis pas si tu es sous VB ou VBA, j'en déduis que tu es sous VB et t'invite donc à utiliser un contrôle TIMER

    Si tu es sous VBA, il est également, à l'aide de la fonction Timer et de Doevents, possible d'assurer une temporisation plus "orthodoxe" de tes déplacements...

    Voilà, à cette étape, ce que je peux dire. J'attends des réponses précises pour te renseigner en connaissance de cause...

  3. #3
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    504
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 504
    Points : 125
    Points
    125
    Par défaut
    bonjour
    merci pour ton intérêt
    excuse moi j'ai fait une petite erreur en recopiant mon code (c'était un code temporaire ou je n'agissait que sur la largeur)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    L = Screen.Width
    H = Screen.Height
    deltay = (H - y) / vit
    deltax = (L - x) / vit
    'tps = Timer
    Do While L > x
    vue.Move L,  H  '
    L = L - deltax
    H = H - deltay
    Loop
    vue.Move x, y
    Mon code fonctionne correctement

    3) une boucle de déplacement donnera toujours une image saccadée... et la vitesse, dépendant alors directement de ta machine, sera variable sur ta machine et pourra être très différente d'une machine à l'autre !
    Y a t'il un autre moyen que d'utiliser une boucle et la méthode move???

    Mon gros problème, et j'aurais aimé que tu fasses un essais pour bien voir le phénomène ! donc quand j'ai une photo moins large que mon écran, j'ai donné à mon controle "image" la hauteur maxi de mon écran et une largeur en proportion avec la photo initiale! donc toujuors moins large que mon écran. lorsque ce controle "image" apparait du coin inférieur droit pour aller en diagonale vers le coin supérieur gauche, il arrive un momment ou toute la largeur du controle image est dans l'écran mais pas encore arrivé à son point final. à partir du momment ou toute la largeur du controle image est visible à l'écran et qu'il continue à se déplacer,là l'image apparait et disparait très rapidement ne laissant plus l'impression d'image à l'écran.

    essaye si tu veux fait défiler une photo plus haute que large , donne lui des dimmension maximale et essaye de lui faire traverser l'écran avec la méthode move et tu me diras comment ça se passe

  4. #4
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    504
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 504
    Points : 125
    Points
    125
    Par défaut
    j'ai oublié de préciser je suis bien en VB

  5. #5
    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
    Mon gros problème, et j'aurais aimé que tu fasses un essais pour bien voir le phénomène
    j'ai fait des essais avec ton code précédent, bien sur.
    Je ne suis pas allé jusqu'à choisir une image plus grande que l'écran.
    Relis maintenant ce que j'ai dit dans mon premier message et :
    Utilise l'objet timer (pas une boucle). Tu as pour celà l'aide en ligne et même un exemple dans les exemples de VB (un papillon qui vole, si ma mémoire est bonne)
    En ce qui concerne ton objet image : regarde à quoi sert la propriété Stretch d'un contrôle image !
    Relis ce que je t'ai dit à propos du choix, plus judicieux, de faire des calculs de déplacement sur la base des dimensions de ta Form plutôt que sur celle des dimensions de ton écran, en gardant à l'esprit, je le répète, qu'il est toujours possible, dans l'événement activate de ta Form, de donner à cette dernière les dimensions de ton écran

    La méthode move (y compris avec un timer) est bien sur à mettre en oeuvre.
    Aucun problème ne se posera jamais avec la propriété top (pour savoir si tu as atteint le haut de ta Form, ni avec la propriété Left, pour savoir si tu as atteint le côté gauche. Il va par contre falloir que tu gères avec la largeur de l'image (pour ce qui est du côté droit de ta Form) et avec sa hauteur (si tu veux ensuite la faire descendre et savoir quand le côté inférieur de ta Form a été atteint)... Tout le reste est question de logique pure, avec ou sans développement informatique

  6. #6
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    504
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 504
    Points : 125
    Points
    125
    Par défaut
    bonsoir
    En ce qui concerne ton objet image : regarde à quoi sert la propriété Stretch d'un contrôle image !
    justement la propriété permet de dimmensionner ma photo à la taille de mon objet "image", ce qui me permet d'avoir des images qui remplissent presque tout l'écran, par contre avec un controle picture quel est le moyen de mettre la photo à la taille du controle picture???

    J'ai bien relu et essayé avec un timer ça ne change rien je crois que c'est l'objet image qui fait ce clignotement à chaque fois que l'objet se déplace avec move ,la photo disparait une fraction de seconde le temps du déplacement pour réaparaitre aussitot
    tandis qu'avec l'objet picture je n'ai pas ce clignotement
    mais je ne sais pas comment faire apparaitre une photo qui remplira presque tout l'écran

    Relis ce que je t'ai dit à propos du choix, plus judicieux, de faire des calculs de déplacement sur la base des dimensions de ta Form plutôt que sur celle des dimensions de ton écran, en gardant à l'esprit, je le répète, qu'il est toujours possible, dans l'événement activate de ta Form, de donner à cette dernière les dimensions de ton écran
    c'est aussi ce que j'ai fait j'ai d'abord dimensinné ma form à la taille maxi de mon écran et lorsque je veux utiliser la taille maxi j'utilise la taille maxi de l'écran c'est le même je pense que la form maxi

    en tout cas encore merci pour tes réponses

  7. #7
    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
    Une PictureBox n'a pas, elle, de propriété Stretch, comme une image.
    Si tu veux la redimensionner, il faudra donc la "repeindre", ce qui est possible avec VB (pixel par pixel), mais dans ce cas très lent. C'est également possible à l'aide de différentes APIs, point par point (assez lent) ou par "blocs" (beaucoup plus rapide). Je ne crois toutefois pas que, pour ce que tu veux faire et au niveau d'encore débutant où tu es, le jeu en vaille la chandelle.
    Tu peux par contre déjà considérablement diminuer ces "clignotements" en plaçant une image (contrôle image) avec sa propriété stretch à true à l'intérieur d'un contrôle PictureBox (il te faudra alors redimensionner, bien sur, les deux. Le déplacement est alors appliqué au contrôle pictureBox et pas au contrôle image (bien sur)
    En ce qui concerne maintenant tes calculs de déplacement : je répète qu'ils seront simplifiés et toujours vrais si tu les fais par rapport à ta Form plutôt qu'à ton écran. Je te répète que tu peux toujours, au démarrage, tout simplement donner ensuite à ta form les dimensions de ton écran !
    Je te répète enfin qu'il te faut inclure dans tes calculs la largeur et la hauteur de ton image si tu ne veux pas qu'elle diparaisse à droite ou en bas, lors de tes déplacements.
    Mais je ne peux que te conseiller (c'est ce que tu demandes) et pas te forcer... Alors ...

  8. #8
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    504
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 504
    Points : 125
    Points
    125
    Par défaut
    bonjour
    je suis avec grand intérêt, j'ai peut être l'air un peu bouché ,mais j'ai des excuses je suis un vieux débutant

    j'ai essayé de mettre dans un controle picturebox un controle image
    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
     
        'défini la largeur et la hauteur de mon objet image
        Image1.Width = Large
        Image1.Height = Haut
     
        'pics objet picture qui contient ma photo
     
        Image1.Picture = Pics     'charge dans image ma photo
        Image1.Stretch = True  'redimensionne la photo à l'intérieur _
    du controle image en fonction de la taille du Image
     
        'rempli l'objet picturebox par l'objet image
        Picture1.Picture = Image1
     
        'redimmentionne l'objet picturebox pour pour faire _
    apparaitre tout l'objet image
     
    soit    Picture1.AutoSize = True
     
    ou soit
        Picture1.Width = Large
        Picture1.Height = Haut
    Maintenant le problème c'est que la photo qui est affichée ne garde pas les dimensions imposées par image.strech

    je n'ai pas bien vu dans les explications comment se servir d'un controle picturebox comme conteneur
    je crois qu'il me manque un bout de code

    Si non comme ça le déplacement se fait correctement, j'utilise un timer pour le déplacement!
    merci d'avance pour ton aide

  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
    comment se servir d'un controle picturebox comme conteneur
    Cà, tu as commencé à le faire, à ce que je vois, et c'est bien (un contrôle Image (avec son image) inséré dans une pictureBox (sans image).
    Propriéré Stretch du contrôle image à True.
    On donne les dimensions voulues à la pictureBox (dynamiquement, par exemple).
    On donne au contrôle image les dimensions de la picturebox, en plaçant le coin supérieur gauche au coin supérieur gauche de la pictureBox (de façon, plus clairement dit, à obtenir, tout-à-faits suoerposés et avec les même dimensions, les 2 contrôles). Tout celà peut très facilement se coder... par l'utilisation des propriétés left, top, widrh et height des 2 contrôles...
    Il ne faut en aucun cas faire ce que tu as fait là :
    Picture1.Picture = Image1
    La picturebox n'est là que pour servir de container et sa propriété picture doit rester vide !
    En ce qui concerne la picturebox, tu ne dois considérer que sa position et ses dimensions, et rien de plus !
    Essaye de mettre déjà celà en oeuvre et reviens si quelque chose t'échappe encore.... mais, honnêtement, je ne vois pas comment dire celà autrement.

  10. #10
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    504
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 504
    Points : 125
    Points
    125
    Par défaut
    mais alors à quel moment tu dits que le controle image est contenu dans le controle picturebox????

  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
    Mais... A aucun moment... JE L'Y PLACE lors de ma "construction" !

    Ouvre donc une Form puis
    place dans la form une PictureBox puis
    Place dans la PictureBox un contrôle image
    Voila !!

    Comprends BIEN que l'image que tu verras n'aura absolument rien à voir avec la propriété Picture de la PictureBox (dont le seul rôle sera de contenir le contrôle image... exactement de la même manière que tu pourrais faire "tenir" n'importe quel autre contrôle (textbox ou ce que tu veux) dans une pictureBox .

  12. #12
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    504
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 504
    Points : 125
    Points
    125
    Par défaut
    Excuse moi mais je ne savais pas que je devais tout simplement desiné mon controle image dans mon controle picture box

    La je crois que je vais pouvoir mieux continuer
    Merci pour ta patience et au plaisir de te reposer des questions

  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
    Tu es le bienvenu !
    Lis bien tout le reste, aussi... çà t'aidera.

  14. #14
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    504
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 504
    Points : 125
    Points
    125
    Par défaut
    Bonjour

    j'ai un autre problème
    des photos soit disant de même taille ont des déplacement plus ou moins rapide, j'avais mis l'interval du timer1 à 1miliseconde et j'ai obtenu des temps de défilement de 1sec à 12sec pour des photos ayant les même dimensions
    voici le code que j'ai utilisé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Timer1.Enabled = True
        Do While Timer1.Enabled = True
            DoEvents
        Loop
     
    Private Sub Timer1_Timer()
    Vit=100
    'calcul l'incrémentation du déplacement du point départ au point arrivée
    deltax = (DepX - Gauche) / Vit
    deltay = (DepY - Supérieur) / Vit
    Picture1.Move Picture1.Left - deltax, Picture1.Top - deltay '
    If Picture1.Left <= Gauche Or Picture1.Top <= Supérieur Then Timer1.Enabled = False
    End Sub
    j'ai essayé autre chose dont voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Private Sub Timer1_Timer()
     
    Vit = 100
    'calcul l'incrémentation du déplacement du point départ au point arrivée
    deltax = (DepX - Gauche) / Vit
    deltay = (DepY - Supérieur) / Vit
    Do Until Picture1.Left <= Gauche Or Picture1.Top <= Supérieur 
    Picture1.Move Picture1.Left - deltax, Picture1.Top - deltay '
    Loop
    Timer1.Enabled = False
    End Sub
    Mais ceci ne fonctionne pas le déplacement est hyper rapide et ne laisse qu'une trace sans avoir le temps de voir l'image
    ou alors il faut que je réintroduise un timer avec un interval de 1miliseconde et là je ré-obtiens des déplacement différent pour 2 photos soit disant identiques

    je pense que le problème viens du poids des photos , le nbre d'octets par pixel mais ça comment puis je le savoir?
    ou as tu un autre moyen ou explication??
    je voulais aussi savoir est ce que des écrans de veille comme celui de windows "mon album photo" sont construit avec des léthodes comme je le conçois ou alors des techniques bien plus élaborée?

  15. #15
    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
    avec des léthodes comme je le conçois ou alors des techniques bien plus élaborée?
    Bien plus élaborées, avec utilisation d'APIs et traitements par "paquets de pixels".
    Un jour tu sauras faire celà...
    Fais pour l'instant avec VB, de sorte à mieux l'assimiler.

Discussions similaires

  1. [XL-2007] png et jpeg avec transparence dans un control image
    Par patricktoulon dans le forum Contribuez
    Réponses: 0
    Dernier message: 21/10/2012, 22h16
  2. Changer l'image d'un control Image avec un stream
    Par Takumi dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 17/11/2009, 00h31
  3. Problème de rafraichissement avec un custom control Image
    Par choas dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 16/10/2008, 15h41
  4. Problème déplacement image avec rollOver
    Par raptor2003 dans le forum Flash
    Réponses: 2
    Dernier message: 13/06/2008, 11h57
  5. Déplacement image avec souris
    Par sabinep dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 31/01/2008, 10h14

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