Déplacement aléatoire d'une Form dans l'écran [Résolu]

cs_gozzer 6 Messages postés jeudi 15 septembre 2005Date d'inscription 8 novembre 2007 Dernière intervention - 30 oct. 2007 à 16:27 - Dernière réponse : cs_gozzer 6 Messages postés jeudi 15 septembre 2005Date d'inscription 8 novembre 2007 Dernière intervention
- 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
Afficher la suite 

Votre réponse

8 réponses

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

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

F.M.

Merci Brosske 3

codes-sources a aidé 82 internautes ce mois-ci

Commenter la réponse de Brosske
Meilleure réponse
Brosske 98 Messages postés jeudi 25 novembre 2004Date d'inscription 12 août 2010 Dernière intervention - 6 nov. 2007 à 11:57
3
Merci
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.

Merci Brosske 3

codes-sources a aidé 82 internautes ce mois-ci

Commenter la réponse de Brosske
Meilleure réponse
Brosske 98 Messages postés jeudi 25 novembre 2004Date d'inscription 12 août 2010 Dernière intervention - 6 nov. 2007 à 15:54
3
Merci
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.

Merci Brosske 3

codes-sources a aidé 82 internautes ce mois-ci

Commenter la réponse de Brosske
Meilleure réponse
Brosske 98 Messages postés jeudi 25 novembre 2004Date d'inscription 12 août 2010 Dernière intervention - 6 nov. 2007 à 18:06
3
Merci
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.

Merci Brosske 3

codes-sources a aidé 82 internautes ce mois-ci

Commenter la réponse de Brosske
cs_gozzer 6 Messages postés jeudi 15 septembre 2005Date d'inscription 8 novembre 2007 Dernière intervention - 6 nov. 2007 à 11:43
0
Merci
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...
Commenter la réponse de cs_gozzer
cs_gozzer 6 Messages postés jeudi 15 septembre 2005Date d'inscription 8 novembre 2007 Dernière intervention - 6 nov. 2007 à 15:25
0
Merci
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...
Commenter la réponse de cs_gozzer
cs_gozzer 6 Messages postés jeudi 15 septembre 2005Date d'inscription 8 novembre 2007 Dernière intervention - 6 nov. 2007 à 16:37
0
Merci
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!
Commenter la réponse de cs_gozzer
cs_gozzer 6 Messages postés jeudi 15 septembre 2005Date d'inscription 8 novembre 2007 Dernière intervention - 8 nov. 2007 à 09:02
0
Merci
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!
Commenter la réponse de cs_gozzer

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.