OnMouseVerlässtDasBild



  • Ich möchte abfangen, wenn der Benutzer das Bild mit der Maus verlässt. Geht das überhaupt? Wenn ja, wie? 🙂



  • Hallo

    welches Control meist du genau mit "das Bild"? Ansonsten gibt es noch die Windows-Message MouseLeave, nach der du suchen kannst.

    bis bald
    akari



  • TPaintBox meine ich...



  • Hallo

    dann mußt du dir dein OnMouseLeave selber erstellen.
    Schau mal hier :
    http://www.c-plusplus.net/forum/viewtopic.php?t=61190

    bis bald
    akari



  • Interessant! Ich werde mal die Situation checken und bei Problemen wieder hier posten. Wusste garnicht, dass das möglich ist. 🙂



  • Hallo

    diese Window-Messages sind eine Grundlage der WinAPI. Die Borland-VCL baut darüber seine eigenen Klassen, die das ganze sinnvoll kapseln (wrappen). Deshalb kannst du eigentlich alles, was nicht in der VCL direkt integriert ist, noch über die WinAPI machen.

    bis bald
    akari



  • Mh... wo muss ich die Änderungen vornehmen?

    (Die PaintBox wird zur Laufzeit erstellt. Hoffe das spielt keine Rolle.)



  • Hallo

    hm, das Beispiel es Links ist für TForms. Du willst es für ein Control im Form, also mußt du das Control selber modifizieren. Dazu leitest du eine eigene Klasse von TPaintBox ab. Da du das Control erst zur Laufzeit benötigst, erleichtert es erstmal.
    1. Erstelle eine neue Unit, die du PaintBoxEx nennst.
    Datei PaintBoxEx.h :

    //---------------------------------------------------------------------------
    #ifndef PaintBoxExH
    #define PaintBoxExH
    //---------------------------------------------------------------------------
    
    // Erweiterung von TPaintBox um MouseLeave und MouseEnter
    class TPaintBoxEx : public TPaintBox
    {
      protected:
    
      // Interne Funktion, die von den Messages aufgerufen werden
      void __fastcall CMMouseEnter(TMessage *Message);
      void __fastcall CMMouseLeave(TMessage *Message);
    
      // interne Speicher für eventuell vorhandene Events, die bei einer MouseX-Message aufgerufen werden sollen
      TNotifyEvent iOnMouseEnter;
      TNotifyEvent iOnMouseLeave;
      public:
    
      // Einbinden der MouseX-Messages
      BEGIN_MESSAGE_MAP
        MESSAGE_HANDLER(CM_MOUSEENTER, TMessage *, CMMouseEnter);
        MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage *, CMMouseLeave);
      END_MESSAGE_MAP(TPaintBox);
    
      // Erweiterter Konstruktor
      __fastcall virtual TPaintBoxEx(Classes::TComponent* AOwner);
      __published:
    
      // Zusätzliche Eigenschaften, um die Events zu setzen
        __property TNotifyEvent OnMouseEnter = {read = iOnMouseEnter, write = iOnMouseEnter};
        __property TNotifyEvent OnMouseLeave = {read = iOnMouseLeave, write = iOnMouseLeave};
      };
    
    #endif
    

    Datei PaintBoxEx.cpp :

    #include <vcl.h>
    #pragma hdrstop
    #include "PaintBoxEx.h"
    #pragma package(smart_init)
    
    // Funktion bei einer MouseEnter-Message
    void __fastcall TPaintBoxEx::CMMouseEnter(TMessage *Message)
    {
      if (iOnMouseEnter != NULL) iOnMouseEnter(this); // Wenn Enter-Event vorhanden, diesen ausführen
      }
    
    // Funktion bei einer MouseLeave-Message
    void __fastcall TPaintBoxEx::CMMouseLeave(TMessage *Message)
    {
      if (iOnMouseLeave != NULL) iOnMouseLeave(this); // Wenn Leave-Event vorhanden, diesen ausführen
      }
    
    // Erweiterter Konstruktor
    __fastcall TPaintBoxEx::TPaintBoxEx(Classes::TComponent* AOwner) : TPaintBox(AOwner)
    {
    
      // Event-Speicher zurücksetzen
      iOnMouseEnter = NULL;
      iOnMouseLeave = NULL;
      }
    

    2. Diese Unit includest du nun in dem Form, das eine TPaintBoxEx erstellen soll
    Datei TForm1.h :

    #include "PaintBoxEx.h"
    ...
    class TForm1
    {
    ...
    __protected 
    
      // zusätzliche Eventfunktion für PaintBoxEx->OnMouseX
      void __fastcall OnPaintBoxExMouseEnter(TObject *Sender); 
      void __fastcall OnPaintBoxExMouseLeave(TObject *Sender);
      ... 
      };
    

    Datei TForm1.cpp :

    ...
    
    // Konstruktor des Forms
    __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
    {
    
      // PaintBoxEx erschaffen und konfigurieren
      TPaintBoxEx *PaintBoxEx = new TPaintBoxEx(this);
      PaintBoxEx->Parent = this;
      // passende Koordinaten und Namen für PaintBoxEx setzen
      PaintBoxEx->OnMouseEnter = OnPaintBoxExMouseEnter;
      PaintBoxEx->OnMouseLeave = OnPaintBoxExMouseLeave;
      }
    
    void __fastcall TForm1::OnPaintBoxExMouseEnter(TObject *Sender)
    {
      // etwas zun, wenn Mouse in PaintBoxEx 
      }
    
    void __fastcall TForm1::OnPaintBoxExMouseLeave(TObject *Sender)
    {
      // etwas zun, wenn Mouse aus PaintBoxEx 
      }
    

    Dies ist ein Minimal-Beispiel, um dir zu zeigen, wo du anfangen kannst.
    Wenn du es richtig machen willst, kannst du noch eine registriete Komponente draus machen, die du zur Entwurfszeit anlegen und mit dem OI bearbeiten kannst.
    Dazu findest du ein Beispiel in der BCB-Hilfe.

    bis bald
    akari



  • Boahh, super! Werde ich mir morgen früh gleich vor Augen führen! :p

    akari for moderation! 🕶


Anmelden zum Antworten