mouseover/mouseout funktion (label) - workaround?!



  • ich hab ein label und würde gerne als hint ein image anzeigen... - also ein image mit einem bild visible machen sobald man über das element fährt. leider gibt es kein mouseoverevent beim lable... aber das mousemove tut es da eigentlich auch.

    das problem ist das mouseout event, denn das gibts auch nicht... wie weiss ich also, wann ich das image wieder verstecken muss!?

    hat einer ne idee?

    danke



  • Schreib ne neue WindowProc für dein Label. In dieser fängst du dann CM_MOUSEENTER und CM_MOUSELEAVE ab. Oder du fragst in der OnMouseMove-Behandlung des Controls, in dem sich das Label befindet, ab, ob das Bild gerade angezeigt wird. Wenn ja, dann wegmachen. 🙂

    [ Dieser Beitrag wurde am 26.06.2002 um 22:56 Uhr von WebFritzi editiert. ]



  • Öh... wie was ... 🙂

    Ich bin leider (noch) nicht so der BcB bzw. C++ Crack. Könntest das nochmal etwas genauer erklären, wie schreibe ich ne neue "WindowProc"?

    Danke schonmal



  • suche in der hilfe nach BEGIN_MESSAGE_MAP, END_MESSAGE_MAP, MESSAGE_HANDLER... da findest du auch einpaar bsp.



  • ist eigentlich ganz einfach
    in die *.h

    protected:
            void __fastcall OnMouseOver(TMessage & Msg);
            void __fastcall OnMouseOut(TMessage & Msg);
            BEGIN_MESSAGE_MAP
            VCL_MESSAGE_HANDLER(CM_MOUSEENTER , TMessage, OnMouseOver)
            VCL_MESSAGE_HANDLER(CM_MOUSELEAVE , TMessage, OnMouseOut)
            END_MESSAGE_MAP(TForm)
    

    und das in deine *.cpp datei

    void __fastcall TForm1::OnMouseOver(TMessage & Msg)
    {
      if( ((TLabel *)Msg.LParam) == myLabel)
      {
           // doit
      }
    }
    
    void __fastcall TForm1::OnMouseOut(TMessage & Msg)
    {
      if( ((TLabel *)Msg.LParam) == myLabel)
      {         
          // doit
      }
    }
    


  • Wenn du noch nicht so firm bist im BCB, dann kannst du auch die zweite Variante nehmen, die ich vorschlug. Benutze eine private bool-Variable. Ich nehme hier mal an, das Label befindet sich direkt auf der Form. Dann tippst du

    // Header
    private:
      bool MouseOverLabel;
    
    // CPP-Datei
    __fastcall TForm1::TForm1(...)
    {
       MouseOverLabel = false;
    }
    //----------------------------------------------------------------------------
    
    void __fastcall TForm1::Label1MouseMove(...)
    {
       if(!MouseOverLabel) 
       {
          MouseOverLabel = true;
          // Bild hinmalen
       }
    }
    //----------------------------------------------------------------------------
    
    void __fastcall TForm1::Form1MouseMove(...)
    {
       if(MouseOverLabel) 
       {
          MouseOverLabel = false;
          // Bild wegmachen
       }
    }
    

    [ Dieser Beitrag wurde am 27.06.2002 um 11:37 Uhr von WebFritzi editiert. ]



  • @raYne: Woher weißt du das mit dem lParam? Irgendwo muss doch ne Dokumentation der Borland-eigenen Window-Messages sein. Weißt du wo?



  • @WebFritzi
    hmm kann ich dir nicht mehr genau sagen..
    ich denke aber google ..
    ist schon etwas aelter. 😞

    ich hatte damals auch die bool version.
    leider wenn man zu schnell mit der maus ist gehts nicht immer.
    zumindest wenn das TLabel dicht am fensterrand ist.



  • ich hab mal - da es eleganter aussieht - raYne's vorschlag probiert... mein label heisst Label5 also hab ich das durch mylable ersetzt.... funktioniert aber nicht... die if bedingung wird nie true... der inhalt nie abgearbeitet....



  • Also, bei mir geht's. BCB3 Std.



  • ich hab bcb5 und es geht nicht... es kommt aber auch kein fehler... die funktion wird aufgerufen nur die if-schleife "funktioniert nicht" ...

    if( ((TLabel *)Msg.LParam) == Label5)
      {
          ShowMessage("mouseout");
      }
    

    ich fuchtel wie wild auf dem label rum, kommt aber nix... das label is in ner groupbox und die auf nem panel, aber das macht normal ja nichts oder?



  • Ich fürchte: Doch, das macht was. Leider empfängt das Panel als Owner des Labels die Nachrichten. Ich denke, die einfachste Variante ist dann die bool-Methode.



  • Bei mir mit BCB5 EP funktionierts wunderprächtig ...



  • Leider empfängt das Panel als Owner des Labels die Nachrichten.

    Nur zur Klarstellung: Owner von Controls ist immer die Form. Das Panel kann hier maximal Parent sein.

    Caption = "Owner: " + Label1->Owner->Name +
              ", Parent: " + Label1->Parent->Name;
    


  • @Jansen
    Klar, stimmt. Hatte ich vergessen.

    F98, das glaube ich dir nicht!



  • wieso benutzt man nicht einfach das MouseMove Ereignis des Formulares? da bekommt man genau die x und y Position der Maus raus und man muss einfach nurnoch eine kleine Kollisionsabfrage machen also vonwegen

    bool sichtbar = false;
    
    if(x < feld->Left && x > feld-> Left + left->Width && y < feld -> Top && y > Feld -> Top + feld -> Height)
    {
      sichtbar = false;
    }
    else sichtbar = true
    

    ka ob das geht, sollte aber



  • Nein, das geht nicht!



  • da bin ich ja beruhigt dass ich mit meinem problem nicht alleine bin.

    also die einzige lösung, welche ich bisher 'gefunden' habe ist die (von WebFritzi) das mousemove ereignis des umliegenden feldes (groupbox) abzufragen...



  • diese Logikrechungen bringen mich nochma um 😃 das hat mich jetzt genervt deshalb habichs gemacht 😃 , so gehts:

    bool sichtbar = false;
    
    int get_mousex(void)
    {
      TPoint mousepos;
      GetCursorPos(&mousepos);
      return mousepos.x;
    }
    
    int get_mousey(void)
    {
      TPoint mousepos;
      GetCursorPos(&mousepos);
      return mousepos.y;
    }
    
    void TForm1::check(void)
    {
    int X = get_mousex()-Left;
    int Y = get_mousey()-Top;
    if(X < feld->Left ||
    X > feld-> Left + feld->Width ||
     Y < feld -> Top ||
     Y > feld -> Top + feld -> Height)
    {
      sichtbar = false;
    }
    else sichtbar = true;
    
    anzeige -> Caption = (AnsiString)(int)sichtbar + " " + (AnsiString)X + " " +  (AnsiString)Y + " " + feld->Left + " " + feld->Top;
    
    }
    
    void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
    check();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::feldMouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
    check();
    }
    //---------------------------------------------------------------------------
    

    sobald FormMouseMove auftritt kannst du auch die Variable auch gleich zurücksetzen aber vieleicht wilsu da ja auchnoch was machen 😃 das gleiche gilt für feldMouseMove und setzen aber dann kannst du das bitmap nicht genau an Curserposition erscheinen lassen



  • Was willst du mit TForm::OnMouseMove, wenn dieses Ereignis bei dem Problem, das wir hier besprechen, garnicht auftritt. Das, was du da machst, ist schlichtweg brotlose Kunst. Und auch, wenn es funktionieren würde, wäre es zu umständlich. Wozu das check()? Wenn OnMouseMove des Labels (bei dir wohl "feld") ausgeführt wird, dann ist es ja wohl klar, dass sich der Cursor über dem Label befindet (und OnMouseMove der Form wird dann NICHT ausgelöst). Und wozu rufst du zweimal GetCursorPos() auf? Einmal hätte es auch getan. Aber jetzt will ich mal nicht so viel auf dir rumhacken. Es ist schön, dass du dich für andere bemühst. Das macht nicht jeder. 🙂


Anmelden zum Antworten