OnMouseEnter, OnMouseLeave



  • wie kann ich die ereignisse OnMouseEnter und OnMouseLeave fuer ein panel erstellen ? geht das ueberhaupt ?

    Meep Meep



  • Klar, die Nachrichten dafuer heissen CM_MOUSEENTER und CM_MOUSELEAVE. Einfach abfangen.
    MfG Aoeke



  • was bedeutet das ? "die Nachrichten dafuer heissen CM_MOUSEENTER und CM_MOUSELEAVE. Einfach abfangen."

    gibts da nicht callbacks oder so ?
    ich wuesste nicht mal von welcher variable die werte CM_MOUSEENTER und CM_MOUSELEAVE bekommen soll. im objektinspektor find ich nichts, wo ich das angezeigt bekomme.

    Meep Meep



  • Schon mal zum Beispiel nach "CM_MOUSELEAVE" gesucht, hier im Forum?

    -junix



  • muss ich jetzt mit Form1->OnMouseMove immer die koordinaten auslesen und ueberpruefen ob er ueber dem panel is ??

    weil OnMouseLeave oder OnMouseEnter hab ich nirgendwo gefunden. ausser bei TLabel.

    Meep Meep



  • Lese in meiner Signatur das thema Komponentenentwicklung den Artikel über Botschaftenbehandlungen / Messages.

    Ein Formular ist letzendlich auch eine Komponente.



  • deine page hab ich mir schon mal angeguckt. aber das kapier ich leider nicht. dafuer bin ich zu dumm. ich hatte nur gehofft, das es dafuer vielleicht auch ne callback funktion gibt. muss ich es halt ueber Form1->OnMouseMove machen und mir ausrechnen, wenn er ueber dem panel is.
    trotzdem danke

    Meep Meep



  • hm,

    hier ncoh mal ein Link zu dem Part, welchen ic meinte:
    http://bcb-tutorial.c-plusplus.net/komponentenentwicklung/komponenten7.html

    Lösung:

    in der Header schreibst du :

    protected:
      virtual void __fastcall WndProc(Messages::TMessage &Message);
    

    und in der CPP:

    //---------------------------------------------------------------------------
    void __fastcall TForm1::WndProc(Messages::TMessage &Message)
    {
    // hier die Nachricht abfangen
      TForm1::WndProc(Message); 
    }
    


  • was ist WndProc ? wo ruf ich die auf ?
    was soll ich damit machen: TForm1::WndProc(Message); ??

    ich hab wie gesagt ueberhaupt keinen tau von dem zeugs. hab mir uebrigens vor ein paar wochen dein tutorial ausgedruckt und bestimmt schon 5-6 mal durchgelesen. aber ich versteh das einfach nicht. mit dem auswendig lernen hab ich schon immer meine probleme gehabt. ich muss etwas verstehen koennen, damit ich was damit anfangen kann.
    gibt es eigendlich fuer den BCB ein buch, wo das alles drinnen beschrieben ist ? also mit dem hintergrund und so ?

    Meep Meep



  • hm
    vieleicht ist eine andere Version besser für dich:

    //--------------------------------------------------------------------------- 
    class TForm1 : public TForm
    { 
    private: 
    protected: 
      void __fastcall CMMouseEnter(TMessage *Message); 
      void __fastcall CMMouseLeave(TMessage *Message);  
    public: 
      __fastcall TForm1(TComponent* Owner); 
    __published: 
      __property AnsiString Caption = { read = FCaption, write = SetCaption, nodefault }; 
      __property OnClick; 
      __property OnDblClick; 
      __property OnMouseDown; 
      __property OnMouseUp; 
      __property OnMouseMove; 
      __property OnStartDrag; 
      __property OnEndDrag; 
      __property OnDragDrop; 
      __property OnDragOver; 
      __property OnEnter; 
      __property OnExit; 
      __property OnKeyPress; 
      __property OnKeyDown; 
      __property OnKeyUp; 
      public:
      BEGIN_MESSAGE_MAP 
        MESSAGE_HANDLER(CM_MOUSEENTER, TMessage *, CMMouseEnter); 
        MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage *, CMMouseLeave); 
      END_MESSAGE_MAP(TForm); 
      }
      //--------------------------------------------------------------------------- 
    void __fastcall TForm1::CMMouseEnter(TMessage* Message) 
    { 
    Over = true; 
    Paint(); 
    } 
    //--------------------------------------------------------------------------- 
    void __fastcall TForm1::CMMouseLeave(TMessage* Message) 
    { 
    Over = false; 
    Paint(); 
    } 
    //---------------------------------------------------------------------------
    

    Ein Buch dazu weiss ich auch nicht. Vielleicht das Handbuch zum BCB. Aber da steht auch nicht mehr drin als in der Hilfe.



  • also ich werd mal einfach so drauf los raten, weil wissen is bei mir da nix:

    BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(CM_MOUSEENTER, TMessage *, CMMouseEnter);
    MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage *, CMMouseLeave);
    END_MESSAGE_MAP(TForm);

    BEGIN_MESSAGE_MAP und END_MESSAGE_MAP(TForm); wird irgendwas sein
    CM_MOUSEENTER: wird wahrscheinlich die windows-botschaft sein
    CMMouseEnter is meine Event-funktion im proggie
    aber was zum henker soll TMessage sein ?? mider BCB hilfe weiß ich auch net mehr, ausser das es ne union is, die aus 2 structs besteht. aber was soll ich damit machen ? wann wird dann eigendlich die eventfunktion aufgerufen ? wenn der maus-cursor ueber der Form is ? dann kann ich ja gleich Form1->OnMouseMove verwenden.
    was macht man mit den zahlen die in TMessage drinnenstehen ?
    und was macht eigendlich in den events das paint() ???

    Meep Meep



  • 1. Schau mal hier.
    2. Ich wuerde mir einfach eine Komponente von TPanel ableiten und bloss die Ereignisse hinzufuegen. Das waere fuer mich das leichteste. 😃
    MfG Aoeke



  • Meep Meep schrieb:

    also ich werd mal einfach so drauf los raten...

    BEGIN_MESSAGE_MAP und END_MESSAGE_MAP(TForm); wird irgendwas sein

    Du brauchst nicht raten.
    Um mich mal selbst zititern zu dürfen:

    Tutorial schrieb:

    Die MessageHandler sind nichts anderes als drei Macros, die zusammengesetzt eine überschriebene Dispatch- Methode ergeben. Deshalb kann man auch nicht diese Macros verwenden und gleichzeitig die Dispatch- Methode überschreiben.
    hm, klingt noch ein wenig Theoretisch. Deshalb schauen wir uns mal den Aufbau der Macros an:

    #define BEGIN_MESSAGE_MAP \
    virtual void __fastcall Dispatch(void Message) \
    { \
    switch (((PMessage)Message)->Msg) \
    {
    #define VCL_MESSAGE_HANDLER(msg,type,meth) \
    case msg: \
    meth(
    ((type *)Message)); \
    break;
    #define END_MESSAGE_MAP(base) \
    default: \
    base::Dispatch(Message); \
    break; \
    } \
    }

    BEGIN_MESSAGE_MAP definiert den ersten Teil des Funktionsrumpfes mit der Einleitung des switch- Teiles. Die Eingefügen VCL_MESSAGE_HANDLER jedes Nachrichtentyps bilden dabei die case- Teile. Der Parameter msg stellt die Bedingung im Case- Zweig dar. Innerhalb des Case- Zweiges wird die ebenfalls übergebene Funktion methmit den Parameter type* aufgerufen. In der Regel ist der Typ des Parameters TMessage. Aber auch andere nachrichtspezifische Typen sind möglich. END_MESSAGE_MAP bildet den Schlussteil der Methode und sorgt dafür, dass die Dispatch- Methode des Vorgängers aufgerufen wird, wenn die Nachricht nicht abgefangen wurde.
    Die Dispatch- Vorgängermethode wird nicht aufgerufen, wenn die Nachricht in einer der VCL_MESSAGE_HANDLER abgefangen wird. Deshalb muss man in der angegebenen Methode die Dispatch- Methode des Vorgängers oder die DefaultHandler- Methode aufrufen.

    [/quote]

    was in den methoden steht kannst du ignorieren. Habs schließlich irgendwo rauskopiert.


Anmelden zum Antworten