Déplacement aléatoire d'une Form dans l'écran

Résolu
cs_gozzer Messages postés 6 Date d'inscription jeudi 15 septembre 2005 Statut Membre Dernière intervention 8 novembre 2007 - 30 oct. 2007 à 16:27
cs_gozzer Messages postés 6 Date d'inscription jeudi 15 septembre 2005 Statut Membre Dernière intervention 8 novembre 2007 - 8 nov. 2007 à 09:02
Bonjour,

Je ne suis pas du tout aguerri en programmation sous VB mais j'ai déjà réussi à écrire quelques lignes qui me permettent d'afficher une Image (Picture box dans une form) tout le temps au premier plan. J'ai aussi réussi à faire en sorte de pouvoir la déplacer sur le bureau à l'aide de la souris.

Là où j'ai du mal, c'est que j'ai besoin qu'elle se déplace toute seule de manière aléatoire (et non sacadée) sur toute la surface de mon écran...

J'ai trouvé beaucoup de pistes sur ce site mais je n'ai réussi à en faire aboutir aucune...

Quelqu'un aurait il la solution ?

Voici ce que j'ai ecrit:

Option
Explicit

'declaration
des constantes

Private
Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal
hWndInsertAfter As Long, ByVal X As Long, Y, ByVal cx As Long, ByVal cy As
Long, ByVal wFlags As Long) As Long

Const
HWND_TOPMOST = -1

'Const
HWND_NOTOPMOST = -2

Const
SWP_NOMOVE = &H2

Const
SWP_NOSIZE = &H1

Const
TOPMOST_FLAGS = SWP_NOMOVE Or SWP_NOSIZE

 

Private Sub
Form_Load()

    Dim WindowRegion As Long

    'Propriétés de la picture box

   
Picture1.AutoRedraw = True

    Picture1.AutoSize = True

    Picture1.BorderStyle = 0

    Picture1.ScaleMode = 3

  
    'Position de la
picture box
     Picture1.top 0: Picture1.left 0

   

    '"Découpe" la form suivant
Picture1

    WindowRegion = MakeRegion(Picture1)

    SetWindowRgn Me.hwnd, WindowRegion, True

   

    'Mise au premier plan

    SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0,
0, 0, TOPMOST_FLAGS

End Sub

 

Private Sub
Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As
Single)

'Pour
déplacer la form

 

        ReleaseCapture

        SendMessage Me.hwnd, WM_NCLBUTTONDOWN,
HTCAPTION, 0&

   End Sub

 

Private Sub
Picture1_DblClick()

'Pour
fermer la form

End

End Sub

8 réponses

Brosske Messages postés 98 Date d'inscription jeudi 25 novembre 2004 Statut Membre Dernière intervention 12 août 2010 1
5 nov. 2007 à 21:44
euh, pourquoi pas simplement :
me.left=...
me.top=...

tout en regardant la résolution de l'écran ??

F.M.
3
Brosske Messages postés 98 Date d'inscription jeudi 25 novembre 2004 Statut Membre Dernière intervention 12 août 2010 1
6 nov. 2007 à 15:54
LOL
oui :)

dans le form_load il serait bien aussi d'activer le timer

....
   Timer1.value=10 'toutes les 10 ms un déplacement
   Timer1.enabled=true
    Me.Top = Rnd * Screen.Height

End Sub

et HUP !!

ça fonctionne :D

F.M.
3
Brosske Messages postés 98 Date d'inscription jeudi 25 novembre 2004 Statut Membre Dernière intervention 12 août 2010 1
6 nov. 2007 à 18:06
un byte= nombre entre 0 et 255
un moment donnée je change le 10 en -10...... et là t'as tout compris :)

à la place de définir le offset en tant que byte, prend un integer par exemple.

F.M.
3
cs_gozzer Messages postés 6 Date d'inscription jeudi 15 septembre 2005 Statut Membre Dernière intervention 8 novembre 2007
6 nov. 2007 à 11:43
Merci,

J'ai essayé ceci:

Randomize
Me.Left = Rnd * Screen.Width
Me.Top = Rnd * Screen.Height

Mais comment faire pour que ce déplacement soit automatique et perpétuel à partir du lancement du .exe ?

J'ai bien pensé à créer une boucle dans Form_Load mais je n'arrive pas écrire un code qui fonctionne...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Brosske Messages postés 98 Date d'inscription jeudi 25 novembre 2004 Statut Membre Dernière intervention 12 août 2010 1
6 nov. 2007 à 11:57
Alors, ajoute un timer sur le form, l'event timer1_timer sera appelé arès chaque x milisecondes. Dans l'event tu mets le bout de code qui déplace un peu le form du style.

dans le form-load :
offsetx=10
offsety=10

dans l'event Timer1_timer:
me.left=me.left+offsetx
me.top=me.top+offsety
'controle si le form ne dépasse pas l'écran:
if me.left<0 or (me.left+me.width)>screen.width then offsetx=-offsetx
if me.top<0 or (me.top+me.heigt)>screen.height then offsety=-offsety

et si tu veux vraiment que le premier emplacement soit bien, il faut changer ton bout de code comme suivant :
Me.Left = Rnd * Screen.Width - me.with-11
Me.Top = Rnd * Screen.Height - me.height-11 'je retire encore 11 pour avoir une réserve

F.M.
0
cs_gozzer Messages postés 6 Date d'inscription jeudi 15 septembre 2005 Statut Membre Dernière intervention 8 novembre 2007
6 nov. 2007 à 15:25
Oki,

Merci pour ton aide F.M. mais je crois que j'ai encore besoin de tes conseils...
Voici ce que j'ai compris de ta deuxième réponse:
-----------------------------------------------------------------
Option Explicit

    Dim offsetx As Byte
    Dim offsety As Byte
_________________________________________________

Private Sub Form_Load()

    offsetx=10
    offsety=10

    Randomize
    Me.Left = Rnd * Screen.Width
    Me.Top = Rnd * Screen.Height

End Sub
_________________________________________________

Private Sub Timer1_Timer()

    Me.Left = Me.Left + offsetx
    Me.Top = Me.Top + offsety
    'controle si le form ne dépasse pas l'écran:
    If Me.Left < 0 or (Me.Left + Me.Width) > Screen.Width Then offsetx = -offsetx
    If Me.Top < 0 or (Me.Top + Me.Height) > Screen.Height Then offsety = -offsety

End Sub
_________________________________________________

Et evidemment, ma form ne bouge pas d'un poil ?!
Je suis sur que j'ai oublié un truc mais je ne vois plus quoi...
0
cs_gozzer Messages postés 6 Date d'inscription jeudi 15 septembre 2005 Statut Membre Dernière intervention 8 novembre 2007
6 nov. 2007 à 16:37
Mille merci...effectivement ça tourne! Enfin, ça se déplace!

Le seul "hic" se situe au niveau des lignes que tu as écrites pour le moment où la form va dépasser l'écran: quand la form touche un bord, au lieu de changer de sens j'ai un message d'erreur:

Erreur d'exécution '6':
Dépassement de capacité

et offsetx = -offsetx se retrouve surligné en jaune... ?

Promis, apres je te fiche la paix!
0
cs_gozzer Messages postés 6 Date d'inscription jeudi 15 septembre 2005 Statut Membre Dernière intervention 8 novembre 2007
8 nov. 2007 à 09:02
J'ai pas été trés malin sur ce coup là!!!
Un énorme MERCI à toi pour ton aide... le résultat est tout à fait ce que je recherchais.

Encore merci et bonne journée!
0
Rejoignez-nous