Retrecir une image lors d'un click [Résolu]

Signaler
Messages postés
23
Date d'inscription
jeudi 14 septembre 2006
Statut
Membre
Dernière intervention
30 mars 2007
-
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
-
Bonjour,

Voila je voudrai que lors d'un click sur une cible (picturebox) celle ci retrecise jusqu'a disparaitre, je vous donne la portion de code correspondant :

sub click_cible...
For i As Integer = 42 To 0     '42 correspond à la largeur actuel de l'image
            For j As Integer = 46 To 0    'idem avec la hauteur
                cible.width = i
                cible.height = j
            Next
        Next
cible.visible = False
cible.Enabled = False

Lorsque je clique l'image disparrait instantanement sans retrecir.

Merci de votre aide

12 réponses

Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
Be oui, celà diminue de 1 à la fois... bien sur..

Le problème n'est pas là mais dans la vitesse de ta machine... qu'il te faut donc ralentir un peu par, par exemple, l'utilisation de la fonction Timer et une boucle sur doevents. Tu peux également marquer une petite pause entre chaque retrécissement par la fonction sleep...
Messages postés
661
Date d'inscription
vendredi 2 décembre 2005
Statut
Membre
Dernière intervention
23 mars 2011
8
Salut,

voici le code pour réduire une picturebox en cliquant dessus :

(Pour tester tu as juste mettre une PictureBox s'appelant PictureBox1 et un Timer s'appelant Timer1 et de mettre une image dans PictureBox1)

code :

Public Class Form1

    Dim i, j As Integer ' Déclaration des variables integer

    Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
        Timer1.Interval = 10 ' on règle le temps entre à chaque rétrécissement de la PictureBox (ici, 10 ms)
        Timer1.Enabled = True ' Activation du Timer
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        diminuer_picturebox() ' Toutes les 10 ms on appelle diminuer_picturebox()
    End Sub

    Sub diminuer_picturebox()
        i = i - 1 ' On enlève 1 à la variable i
        j = j - 1 ' On enlève 1 à la variable j
        PictureBox1.Width = i ' On fixe la nouvelle taille de la picturebox
        PictureBox1.Height = j
        If i = 0 And j = 0 Then ' Si i = 0 et j = 0 
            Timer1.Enabled = False ' On désactive le Timer
            PictureBox1.Visible = False ' On rends la picturebox invisible
            PictureBox1.Enabled = False ' On désactive la picturebox
        End If
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Timer1.Enabled = False ' Désactivation du Timer pour être sur qu'il ne démarre pas dés le début
        i = PictureBox1.Width ' On initialise la variable i avec la largeur de la picturebox
        j = PictureBox1.Height ' On initialise la variable j avec la hauteur de la picturebox 
    End Sub
End Class, ----

(Coloration syntaxique automatique par Kenji)

------------------------------------------------------------------------------------------------------------
Si ce message a réglé ton problème >>>>>>>>>> Accepter la réponse  
Messages postés
1141
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
19 septembre 2007
2
Question con mais quand tu fais next, t'es sur que i = i - 1 et j = j -1
Messages postés
1141
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
19 septembre 2007
2
A désolé mais tu vas jusqu'à 0 aussi, alors une taille de 0 c'est,     bah rien
Messages postés
23
Date d'inscription
jeudi 14 septembre 2006
Statut
Membre
Dernière intervention
30 mars 2007

J'ai tester vos 2 hypotheses mais sans succes.Je  viens de faire une execution pas à pas et j'ai constater que le programme n'entre même pas même pas dans la boucle.

J'ai donc remplacer mon code par celui ci :

Dim i As Integer = 43
        Dim j As Integer = 48

       
        While i > 10
            While j > 10
                cible.width = i
                cible.height = j
                i = i - 1
                j = j - 1
            End While
        End While

Celui ci fonctionne par contre comme dit plus haut le programme le fait quasi instantanement.

Je vais essayer l'idée tu timer et je vous dit les resultats.
Messages postés
23
Date d'inscription
jeudi 14 septembre 2006
Statut
Membre
Dernière intervention
30 mars 2007

L'idée du sleep est correct mais pas adapté à ma situation car elle bloque tout le programme alors qu'il faudrai qu'il continue de tourner en fond.

Merci à vous :)
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
Juste un mot : je n'ai en aucun cas parlé du timer, qui est un contrôle, mais de la fonction Timer, qui est autre chose
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Tu peux aussi ralentir en trichant dans la boucle :

For i As Integer = 420000 To 10000     '42 correspond à la largeur actuel de l'image
            For j As Integer = 460000 To 10000    'idem avec la hauteur
                cible.width = Clng(i/10000)
                cible.height = Clng(j/10000)
                DoEvents
            Next
        Next
cible.visible = False
cible.Enabled = False

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
661
Date d'inscription
vendredi 2 décembre 2005
Statut
Membre
Dernière intervention
23 mars 2011
8
Salut,


Public Class Form1


       Dim i As Integer

       Dim j As Integer


sub click_cible...

                i = 42

                j = 42

                Timer1.Interval = 100

                Timer1.Enabled = True
End Sub


Sub diminuer_picturebox()

         i = i - 1
        
j = j - 1
        
cible.width = i

         cible.height = j

         if i 0 And j 0 Then

              Timer1.Enabled = False

              cible.Visible = False

              cible.Enabled = False

         End If

End Sub


Public Sub Timer_Tick...

        diminuer_picturebox()

End Sub


--------------------------------------------------------------------------------


Si ce message a réglé ton problème >>>>>>>>>>> Accepter la réponse    
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Pardon, faudrait mettre To 4900 pour arriver jusqu'à 0 pour la taille de l'image

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
14757
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
14 janvier 2021
151
Bonjour

Utilise un thread ou un Application.doevents.

Il est plus facile de batiser quelqu'un que de le convertir.(surtout en programmation)
VB (6, .NET1&2), C++, C#.Net1
Mon site
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
Salut à tous,

Comment diable se fait-il qu'avec VB.Net on ne puisse pas faire ce qui, sous VB6 est aussi simple que ceci :

Private Sub Form_Activate()
  Me.ScaleMode = vbPixels
End Sub




Private Sub picture1_Click()
      Dim couic As Integer, coef As Double
      couic = 10
      coef = Picture1.Height / Picture1.Width
      For i = 1 To Picture1.Width - couic Step couic
        On Error Resume Next
        Picture1.Move Picture1.Left, Picture1.Top, Picture1.Width - i, Picture1.Height - (i * coef)
        start = Timer
        While Timer <= start + 0.1
          Picture1.Visible = False
          Picture1.Visible = True
          DoEvents
        Wend
        If Err Then Picture1.Visible = False: Exit For
      Next
End Sub




(Pas de timer et je garde les proportions de ma picturebox)
J'espère que l'équivalent existe avec VB.Net (autrement celà fera une raison de plus pour que je ne l'adopte jamais...)