Déplacement souris + image

Résolu
cs_katharos Messages postés 10 Date d'inscription mardi 27 février 2007 Statut Membre Dernière intervention 14 mars 2007 - 6 mars 2007 à 11:20
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 - 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

12 réponses

sylvunix Messages postés 93 Date d'inscription mardi 11 avril 2006 Statut Membre Dernière intervention 4 mars 2009
6 mars 2007 à 12:39
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;
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
6 mars 2007 à 12:39
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.
sylvunix Messages postés 93 Date d'inscription mardi 11 avril 2006 Statut Membre Dernière intervention 4 mars 2009
6 mars 2007 à 11:49
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 ...
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
6 mars 2007 à 11:58
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.

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

Posez votre question
cs_katharos Messages postés 10 Date d'inscription mardi 27 février 2007 Statut Membre Dernière intervention 14 mars 2007
6 mars 2007 à 12:10
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
cs_katharos Messages postés 10 Date d'inscription mardi 27 février 2007 Statut Membre Dernière intervention 14 mars 2007
6 mars 2007 à 12:17
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é
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
6 mars 2007 à 12:38
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" />
sylvunix Messages postés 93 Date d'inscription mardi 11 avril 2006 Statut Membre Dernière intervention 4 mars 2009
6 mars 2007 à 12:44
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.
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
6 mars 2007 à 13:01
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" />
Utilisateur anonyme
6 mars 2007 à 15:38
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;

@+
Utilisateur anonyme
6 mars 2007 à 15:39
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;
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
6 mars 2007 à 16:06
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'
Rejoignez-nous