Déplacement souris + image [Résolu]

cs_katharos 10 Messages postés mardi 27 février 2007Date d'inscription 14 mars 2007 Dernière intervention - 6 mars 2007 à 11:20 - Dernière réponse : japee 1792 Messages postés vendredi 27 décembre 2002Date d'inscription 12 novembre 2016 Dernière intervention
- 6 mars 2007 à 16:06
J'aimerais pouvoir animer une image en l'agrandissant et en la mettant au premier plan juste quand la souris passe dessus cette image, quand la souris n'est plus dessus j'aimerais que l'image redeviennent comme avant. Merdi d'avance je ne trouve que des codes avec des clic
Afficher la suite 

12 réponses

Répondre au sujet
sylvunix 103 Messages postés mardi 11 avril 2006Date d'inscription 4 mars 2009 Dernière intervention - 6 mars 2007 à 12:39
+3
Utile
Si l'image ne s'agrandit pas, il manque certainement la propriété Strech à True pour Image1.

En tenant compte de la remarque de Loda que je salue au passage, le code devient :

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  // Agrandissement de l'image
  Image1.Height := 482;
  Image1.Width := 706;

  // Armer le timer
  Timer1.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  // Regarder si la souris est en dehors de l'image
  if not PtInRect(Image1.BoundsRect, Mouse.CursorPos) then
  begin
    // Réduction de l'image (remettre la taille initiale)
    Image1.Height := 48;

    Image1.Width := 70;

    // Désarmer le timer
    Timer1.Enabled := False;
  end;
end;
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de sylvunix
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 6 mars 2007 à 12:39
+3
Utile
Le code de Loda permet de savoir si la souris est au dessus de l'image ou pas.


AU moins une faute de frappe d'ailleurs, c'est : if not PtInRect(image1.boundsrect, Mouse.cursorpos) then

Ca remplace :

  if (Mouse.CursorPos.X-Form1.Left < Image1.Left) or
     (Mouse.CursorPos.X-Form1.Left > Image1.Left+Image1.Width) or
     (Mouse.CursorPos.Y-Form1.Top < Image1.Top) or
     (Mouse.CursorPos.Y-Form1.Top > Image1.Top+Image1.Height) then


Pour ton image qui change pas de dimensions... C'est peut être une
propriété de ton composant qui force la taille de celui-ci à la taille
de l'image.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_rt15
sylvunix 103 Messages postés mardi 11 avril 2006Date d'inscription 4 mars 2009 Dernière intervention - 6 mars 2007 à 11:49
0
Utile
Bonjour katharos,

Je pense que tu as trouvé facilement l'évènement OnMouseMove de ton TImage qui est appelé lorsque la souris passe au dessus de l'image.

Le problème est que tu n'auras pas d'évènement pour te signaler que la souris n'est plus sur l'image.

Tu peux créer un timer qui après un certain temps (1000 ms par exemple) effectuera ce contrôle. Voici un exemple de code :

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  // Ici ton code pour agrandir l'image ...

  // Armer le timer
  Timer1.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  // Regarder si la souris est en dehors de l'image
  if (Mouse.CursorPos.X-Form1.Left < Image1.Left) or
     (Mouse.CursorPos.X-Form1.Left > Image1.Left+Image1.Width) or
     (Mouse.CursorPos.Y-Form1.Top < Image1.Top) or
     (Mouse.CursorPos.Y-Form1.Top > Image1.Top+Image1.Height) then
  begin
    // Ici ton code pour réduire l'image ...

    // Désarmer le timer
    Timer1.Enabled := False;
  end;
end;

Il y a peut-être mieux mais en tout cas cette solution fonctionne ...
Commenter la réponse de sylvunix
cs_Loda 900 Messages postés vendredi 3 novembre 2000Date d'inscription 30 juillet 2009 Dernière intervention - 6 mars 2007 à 11:58
0
Utile
salut,

juste un "trucs" pour simplifier:

PtInRect

if not PtInRect(image1.boudsrect, Mouse.cursorpos) then
// (de mémoire)

A+

Loda
<hr size="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
Commenter la réponse de cs_Loda
cs_katharos 10 Messages postés mardi 27 février 2007Date d'inscription 14 mars 2007 Dernière intervention - 6 mars 2007 à 12:10
0
Utile
Oui merci j'avais trouvée OnMouseMove (bonne idée le timer) mais j'ai encore un probleme dans ton code tu as mis //Ici ton code pour agrandir l'image ... mais cette image ne s'agrandie pas. Aurai je oublié quelque chose j'ai juste fait :

   Image1.Height := 482;
   Image1.Width := 706;

à la place de Ici ton code pour agrandir l'image dans le OnMouseMove. Merci
Commenter la réponse de cs_katharos
cs_katharos 10 Messages postés mardi 27 février 2007Date d'inscription 14 mars 2007 Dernière intervention - 6 mars 2007 à 12:17
0
Utile
Merci Loda mais je suis débutante, ou doi je placé ce test. Je suis alé voir l'aide de delphi la dessus mais je ne vois pas vrément son utilité
Commenter la réponse de cs_katharos
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 6 mars 2007 à 12:38
0
Utile
Salut,

personnellement j'utiliserais OnMouseEnter et OnMouseLeave qui, me semble, sont bien plus appropriés et du coup plus besoin de Timer ni de PtInRect

Et pour ton problème de taille il faut aussi penser à mettre la propriété Stretch du TImage à True pour voir les changements de taille

 
@+
Cirec

<hr size="2" />
Commenter la réponse de Cirec
sylvunix 103 Messages postés mardi 11 avril 2006Date d'inscription 4 mars 2009 Dernière intervention - 6 mars 2007 à 12:44
0
Utile
Bonjour Cirec,

En ce qui concerne la propriété Stretch, nos messages se sont croisés !

Par contre les évènements OnMouseEnter et OnMouseLeave ne sont pas codés dans TImage (sauf erreur de ma part) et je ne vois pas sur quels composants tu peux les accrocher.
Commenter la réponse de sylvunix
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 6 mars 2007 à 13:01
0
Utile
Tout dépend de la version de Delphi

je viens de le faire sous Turbo Delphi:

//Propriétés à changer
//Image1.AutoSize:= False;

//Image1.Stretch := True;

procedure TForm1.Image1MouseEnter(Sender: TObject);
Var aRect : TRect;
begin
  aRect : = Image1.BoundsRect;
  InflateRect(aRect , 3, 3);
  Image1.BoundsRect := aRect;
end ;

procedure TForm1.Image1MouseLeave(Sender: TObject);
Var aRect : TRect;
begin
  aRect : = Image1.BoundsRect;
  InflateRect(aRect , -3, -3);
  Image1.BoundsRect := aRect;
end ;

sinon elle s'ajoutent très facilement

 
@+
Cirec

<hr size ="2" />
Commenter la réponse de Cirec
Utilisateur anonyme - 6 mars 2007 à 15:38
0
Utile
Salut,

Je me mèle à vous si ca vous gène pas . Juste une remarque sur ce petit bout de code 

// Réduction de l'image
  Image1.Height := 482;
  Image1.Width := 706;

Dans le cadre d'un agrandissement/réduction il serait mieux de ne pas utiliser de valeurs numériques sans signification.

Il serait plus correct d'écrire par exemple sur le concept d'écrire

 // Réduction de l'image  de 10%.
  Image1.Height := Image1.Height  DIV 10;
  Image1.Width := Image1.Width   DIV 10;

@+
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 6 mars 2007 à 15:39
0
Utile
Oh là la boulette (C'est la journée lol)

 // Réduction de l'image  à 10%.
  Image1.Height := Image1.Height  DIV 10;
  Image1.Width := Image1.Width   DIV 10;
Commenter la réponse de Utilisateur anonyme
japee 1792 Messages postés vendredi 27 décembre 2002Date d'inscription 12 novembre 2016 Dernière intervention - 6 mars 2007 à 16:06
0
Utile
Attention !

if not PtInRect(Image1.BoundsRect, Mouse.CursorPos) then

ne va fonctionner que si le form est en position (0,0), puisque cursorPos est la position par rapport à Screen.

il vaut mieux faire :

if not PtInRect(Image1.BoundsRect, ScreenToClient(Mouse.CursorPos)) then

Bonne prog'
Commenter la réponse de japee

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.