IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Image qui change au passage de la souris


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Par défaut Image qui change au passage de la souris
    Bonjour !!

    J'ai un souci dans le "pour faire joli" de mon application....

    J'aimerais utiliser une image comme control plutôt qu'un bouton puisque je peux utiliser un bouton plus fency. J'aimerais toutefois que lorsque l'utilisateur pointe ce bouton avec la souris que l'image change. Typiquement, le "bouton" serait de la couleur du fond de l'appli, et lorsque l'on amène le curseur dessus, l'image changerait.

    J'ai essayé l'évènement onMouseMove, qui fonctionne bien lorsque la souris arrive dessus, mais bien sur l'image n'est pas rétablie lorsque l'on quitte le bouton. Les évènements onMouseUp et Down ne sont là que pour lorsque l'on clique.

    Est-ce que quelqu'un aurait une idée ?? Vite fait, ma solution serait d'utiliser l'évènement onMouseMove, de détecter la position de la souris et dès qu'on arrive au bord de l'image (à 1 pixel près), et bien on rétablit l'image de départ. La question est alors de savoir à quelle fréquence est actualisée cet évènement... ?

    Thks

  2. #2
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut androz
    Peut etre comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
    if((X > 1 && Y > 1) && (X < 104 && Y < 104))
            {
            Image1->Picture->LoadFromFile("D:\\Copie_USB\\Sauvegarde mes documents C\\Mes images\\Massiv10\\Massiv10\\Bitmaps\\Arrow\\arrow1c.bmp");
            }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
            Image1->Picture->LoadFromFile("D:\\Copie_USB\\Sauvegarde mes documents C\\Mes images\\Massiv10\\Massiv10\\Bitmaps\\Arrow\\arcarrow1.bmp");
    }
    //---------------------------------------------------------------------------

  3. #3
    Membre confirmé
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Par défaut
    Salut Blondelle

    Ouais, ben c'est la méthode que j'ai utilisée, mais je trouve pas ça terrible puisqu'on génère un message à chaque fois que la souris bouge sur la fiche...

    J'ai essayé également de changer l'image dès qu'on atteint les bords du bouton, mais avec des déplacements trop rapides de la souris, ça marche pas terrible.

    Est-ce que quelqu'un sait comment utiliser la commande de style csDisplayDragImage ??? ça avait l'air intéressant, mais je n'ai aucune idée de comment utiliser ça et je ne trouve pas d'aide dans l'aide de BCB6, et pas grand chose avec mon ami google...

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Dans le même genre mais avec deux images superposées.
    Au départ, Image1 est au premier plan.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
    Image2->BringToFront();
    Image2->Tag = 1;
    }
    //----
    void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
    if(Image2->Tag == 1)
        {
        Image1->BringToFront();
        Image2->Tag = 0;
        }
    }
    A plus !

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Ou encore plus simple (toujours avec nos deux images superposées):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
    Image1->Visible = false;
    }
    //----
     
    void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
    if(Image1->Visible == false)
        {
        Image1->Visible = true;
        }
    }
    A plus !

  6. #6
    Membre confirmé
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Par défaut
    Salut !

    Merci pour ta réponse...
    En effet, c'est bien comme ça que je procède, mais ça ne me convient pas trop. Ceci implique qu'on génére un message à chaque fois que la souris bouge sur la fiche, et je me demande si ça prend pas des ressources pour rien.

    Au début, je voulais faire un nouveau composant, mais bofbof, ça ne fait que déplacer le problème.

    Personne n'a entendu parler de la propriété de style csDisplayDragImage ??? J'ai rien trouvé ou presque sur le sujet....

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Par défaut
    Pour gérer le statut Hot sur un control: TrackMouseEvent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    TRACKMOUSEEVENT tme;
    ZeroMemory(&tme, sizeof(tme));
    tme.cbSize = sizeof(tme);
    tme.dwFlags = TME_LEAVE;
    tme.hwndTrack = control Handle
    TrackMouseEvent(tme);
    Tu fais ça à chaque fois que la souris entre dans le controle.
    Cela déclenche un evénement WM_MOUSELEAVE.

    Yarp

  8. #8
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    En effet, c'est bien comme ça que je procède, mais ça ne me convient pas trop. Ceci implique qu'on génére un message à chaque fois que la souris bouge sur la fiche, et je me demande si ça prend pas des ressources pour rien.
    Je n'ai pas tester, mais voilà une solution simple qui évite de déclencher plusieurs fois la fonction inutilement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
    {
      //[...] GESTION IMAGE
      Form1->OnMouseMove = FormMouseMove;
      Image1->OnMouseMove = NULL ;
    }
     
    void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
    {
      //[...] GESTION IMAGE
      Form1->OnMouseMove = NULL ;
      Image1->OnMouseMove = Image1MouseMove;
    }

  9. #9
    Membre confirmé
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Par défaut
    Hello !!

    Bon enfin, après de nombreuses recherches, j'ai trouvé la (une) solution plus jolie de ce que je voulais faire. Merci à Yarp pour m'avoir donné la piste à suivre.

    Voici donc un lien vers la solution : Lien

    J'ai cependant encore un souci avec ...

    La ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Controls::TWndMethod OldLabelWP;
    me renvoie comme message d'erreur à la compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [C++ Error] Unit1.h(21): E2316 'TWndMethod' is not a member of 'Controls'
    J'ai essayé de rechercher un peu voir si j'avais pas oublié qqch dans le header, mais non, tout devrait y être....

  10. #10
    Membre confirmé
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Par défaut
    Ok c'est bon, j'ai simplement changé ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Controls::TWndMethod OldLabelWP;
    par
    dans mon header et ça roule

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. galerie suivant précedent avec texte, lien et image qui change
    Par djedje37et28 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 08/09/2007, 12h58
  2. Image qui change au survole d'une aire
    Par dark_vidor dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 06/11/2006, 22h44
  3. Réponses: 1
    Dernier message: 24/09/2006, 19h39
  4. image qui s'affiche au dessus avec souris au passage sur un lien
    Par pierrot10 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 18/09/2006, 22h55
  5. Image qui change lorsqu'on clique
    Par marsupilami34 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 05/08/2005, 17h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo