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 :

C++ Builder : Surcharge MouseEnter


Sujet :

C++Builder

  1. #1
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 31
    Par défaut C++ Builder : Surcharge MouseEnter
    Bien le bonjour à toute et à tous !

    Je suis en train de développer un composant visuel héritant de TCustomControl et je souhaiterais dériver la fonction MouseEnter afin d'effectuer un traitement particulier lors de l'entrée de la souris sur la surface du controle.

    Le problème : je ne connais pas la spécification de la fonction MouseEnter dans TCustomControl, contrairement à MouseDown.

    Au fil de mes recherches, j'ai trouvé les différents prototypes suiants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    DYNAMIC void __fastcall MouseEnter(TControl* AControl);
     
    virtual void __fastcall MouseEnter(TMessage& Message);
     
    virtual void __fastcall CMMouseEnter(void); // Delphi
     
    //j'ai même tenté :
     
    virtual void __fastcall MouseEnter(void);
    Mais tout ceci sans résultalt : la fonction MouseEnter n'est jamais appelée lors de l'entrée du pointeur de la souris sur la surface du composant.

    Aurais-je omis un point important ?

    Merci de me donner un coup de pouce

    OtO

  2. #2
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 31
    Par défaut Suite du périple...
    Bien le bonjour !

    Ne parvenant pas à surcharger la bonne fonction MouseLeave, j'ai donc décidé d'approcher le problème différemment en intervenant directement dans la procédure WndProc du composant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void __fastcall TImgTextButton::WndProc(TMessage& Message)
    {
    	if(Message.Msg == WM_MOUSELEAVE)
    	{
    		MouseLeave();
    	}
    	else
    		TWinControl::WndProc(Message);
    }
    Ce qui fonctionne très bien... une seule fois. En effet, la première sortie de la surface du composant génère bien un message WM_MOUSELEAVE, mais ensuite plus rien. J'ai beau passer et repasser sur le bouton, aucun message WM_MOUSELEAVE n'est généré. Alors les événement OnMouseMove, ... eux sont bien appelés.

    Alors en bouquinant la doc des API, j'ai cru comprendre qu'une fois le message WM_MOUSELEAVE généré, la fonction TrackMouseEvent prenait fin et qu'il fallait la relancer sitôt que le pointeur de la souris entrait dans la surface du composant. Ce que je fis dans la fonction MouseMove :

    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 TImgTextButton::MouseMove(Classes::TShiftState Shift, int X, int Y)
    {
    	TRACKMOUSEEVENT Info;
    	Info.cbSize = sizeof(Info);
    	Info.hwndTrack = Handle;
    	Info.dwFlags = TME_CANCEL || TME_LEAVE;
     
    	TrackMouseEvent(&Info);
     
    	if(OnMouseMove)
    		OnMouseMove(this, Shift, X, Y);
     
    }
    Malheureusement sans plus de succès.

    Si vous avez une solution à ce problème, je prends volontiers

    Merci d'avance

    OtO

  3. #3
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 31
    Par défaut Trouvé !
    Bien le bonjour à tous !

    C'est bercé d'une immense allégresse que je viens vous voir afin de vous informer que j'ai enfin trouvé mon erreur, et de par ce fait, la solution à mon problème !

    En fait il me suffisait d'enlever le else dans la WndProc afin de toujours exécuter la fonction WndProc du parent TWinControl.

    La nouvelle WndProc de mon composant donne donc ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void __fastcall TImgTextButton::WndProc(TMessage& Message)
    {
    	if(Message.Msg == WM_MOUSELEAVE)
    	{
    		MouseLeave();
    	}
     
            TWinControl::WndProc(Message);
    }
    Et là, tout fonctionne parfaitement

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

Discussions similaires

  1. Choisir Visual c++ ou Borland C++Builder ?
    Par DevEric dans le forum Choisir un environnement de développement
    Réponses: 31
    Dernier message: 14/06/2007, 23h48
  2. Outils, cours et NOUVEAUX tutoriels pour Borland C++Builder
    Par hiko-seijuro dans le forum C++Builder
    Réponses: 10
    Dernier message: 12/03/2006, 22h33
  3. c++ builder JavaDoc :)
    Par JEG dans le forum C++Builder
    Réponses: 8
    Dernier message: 08/06/2002, 13h31
  4. Documentation DirectX dans C++Builder 3
    Par srvremi dans le forum DirectX
    Réponses: 1
    Dernier message: 26/04/2002, 09h59
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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