Form automatisch ausblenden



  • Hallo alle zusammen

    Ich habe noch eine Frage. Ich habe eine Form die ich in den rechten Bildschirmrand verschwinden lasse und nur 10Pixel rausgucken lasse.
    Wenn die Form benötigt wird, dann wird sie mit der Funktion FormMouseMove wieder hergeholt. Nun habe ich aber das Problem das ich nicht weiß wie ich sie wieder in den Rand reinschiebe wenn die Maus nicht mehr auf der Form ist.

    Kann mir da wer einen Vorschlag machen?

    Von der Funktionsweise soll es so sein wie bei der Taskleiste von Windows wenn man die Eigesnchaft "automatisch ausblenden" aktiviert.



  • OnMouseLeave ??



  • OnMouseLeave gibt es nicht laut borland hilfe.





  • Leider Hilft mir das nicht viel. Da ich eine Meldung oder ähnliches brauche wenn die Maus nicht mehr auf der Form ist. Aber so bekomme ich nur angaben wo sich die Maus gerade auf der Form befindet.

    Gibt es nicht die Möglichkeit zu ermitteln wann die Maus nicht mehr auf der Form ist?



  • Hallo

    Das steht doch in dem von Braunstein geposteten Link. Da es den OnMouseLeave-Event nicht gibt must du ihn selber nachbauen, indem du die entsprechende WinAPI-Message abfängst.

    bis bald
    akari



  • Also beim BDS 2006 gibts TForm->OnMouseLeave



  • Also im Borlad Builder 5 gibt es die Methode nicht.
    Ich habe jetzt in meiner header

    public:
       BEGIN_MESSAGE_MAP
        MESSAGE_HANDLER(CM_MOUSEENTER, TMessage *, CMMouseEnter);
        MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage *, CMMouseLeave);
      END_MESSAGE_MAP(TForm);
    
    protected:
      void __fastcall CMMouseEnter(TMessage *Message);
      void __fastcall CMMouseLeave(TMessage *Message);
    

    und in meiner cpp hab ich folgendes stehen

    //---------------------------------------------------------------------------
    void __fastcall TMain::CMMouseEnter(TMessage* Message)
    {
       Over = true;
    
    }
    //---------------------------------------------------------------------------
    void __fastcall TMain::CMMouseLeave(TMessage* Message)
    {
       if(Screen->MonitorCount < 2)
       {
          //Dialogmaske ausrichten
          Main->Left = Screen->Width - 10;
          Main->Top = 0;
       }
       else
       {
          //Dialogmaske ausrichten
          Main->Left = (Screen->Width * 2) - 10;
          Main->Top = 0;
       }
    }
    //---------------------------------------------------------------------------
    

    Nun hab ich leider das Problem das meine Dialogmaske zwar erscheint, aber sobald ich die Maus dann in Richtung eines Buttons bewege um in zu aktivieren verschwindet die Dialogmaske wieder.

    Kann mir wer sagen woran das liegt?

    Das steht doch in dem von Braunstein geposteten Link.

    Wenn ich das so mache, dann bekomme ich den Fehler StackOverflow.

    Wäre toll wenn jemand posten könnte wie es auszusehen hat, denn aus den verschiedenen Beispielen werde ich nicht schlau.



  • http://www.ricosonntag.de/download_bcb.htm

    Die Komponente RSColorButton zeigt intern, wie MouseLeave/ MouseEnter auch in BCB 5.0 / 5.0 geht



  • Toll.... Nachdem ich das eingebunden hatte, bekomme ich immer die Fehler meldung:
    [Linker Fataler Fehler] Unable to open file 'VCLE50.LIB'

    Wie bekomme ich das wieder weg?



  • Ceene schrieb:

    Toll.... Nachdem ich das eingebunden hatte, bekomme ich immer die Fehler meldung:
    [Linker Fataler Fehler] Unable to open file 'VCLE50.LIB'

    Wie bekomme ich das wieder weg?

    Gute Frage.
    WAS hast Du "eingebunden" ?



  • Egal, ich mach es einfach nochmal neu 😡



  • Ich habe das Projekt nun noch einmal neu gemacht und es geht wieder. Keine Ahnung wo der Fehler her kam.

    Kennt jemand ein Seite wo das mit schönen Beispielen beschrieben ist? Das mit dem onMouseLeave für bcb 5? Ich bekomm das einfach nicht hin.



  • Das Problem mit MouseLeave ist, daß das Event auch für die Form ausgelöst wird, wenn der Mauszeiger auf eine darauf enthaltene Komponente (z.B. Button) bewegt wird.
    Mein Vorschlag wäre, du nimmst einen Timer, der z.B. alle halbe Sekunde prüft, ob der Mauscursor noch über deinem Formular ist.
    Mit "Mouse->CursorPos" kommst du an die aktuelle Mausposition (in Screenkoordinaten). Mit der Methode "ClientToScreen(...)" kannst du die Formularposition umrechnen.

    Soweit ich weiß, funktionieren so auch die ApplicationBars, da hier immer eine gewisse Verzögerung dabei ist (u. auch eine Aus/-Einblendfunktionalität).



  • Das ist eine gute Idee. Ich habe nun auch einen Timer eingebaut und hole mir alle halbe Sekunde die position der Mouse mit "Mouse->CursorPosition" und lese mir das in eine TPoint Variable.

    Leider weiß ich nicht, wie ich nun prüfen kann ob ich mich über dem Formular befinde. Wie komme ich denn an die Koordinaten von dem Formular? ClientToScreen geht dafür nicht.

    EDIT:

    Ich hab das nun mal so getestet, aber es geht nicht wirklich, ich bekomme immer den Fehler "zeiger auf Struktur auf linker Seite von -> oder von ->*erforderlich"

    Der Code sieht wie folgt aus

    void __fastcall TMain::Timer1Timer(TObject *Sender)
    {
       TPoint form;
       TPoint mouse;
    
       form = TPoint(Main->Left,Main->Top + Main->Height);
       mouse = Mouse->CursorPos;
    
       if((mouse->x <= form->x)&&(mouse->y >= form->y))
       {
          Main->FormShow(Main);
       }
    }
    


  • TPoint ist eine Struktur, also einfach den Punkt verwenden.
    Außerdem mußt du je Richtung (x und y) jeweils eine Bereich abfragen:

    Hier mein ungetestetes Beispiel:

    // in der Timer-Methode der MainForm
    
    TPoint mouse = Mouse->CursorPos;
    
    TPoint left_top = ClientToScreen(Point(0, 0));
    TPoint right_bottom = ClientToScreen(Point(Width, Height));
    
    if( mouse.x >= left_top.x && mouse.x < right_bottom.x &&
        mouse.y >= left_top.y && mouse.y < right_bottom.y)
    {
      // Main->FormShow(Main); // <- was soll das denn??
    
      Visible = true;
    }
    else
    {
      Visible = false;
    }
    

    Das obere kann man auch noch kürzer schreiben (bzgl. Visible), aber vielleicht möchtest du ja noch bestimmte andere Aktionen ausführen.

    In einer Event-Methode eines Formulars hast du implizit den Zeiger auf das Formular (this), so daß du nicht explizit mit Main->... zugreifen brauchst.



  • // Main->FormShow(Main); // <- was soll das denn??

    In der FormShow richte ich nur die Dialogmaske aus.



  • Es geht sehr gut so, vielen Dank.



  • Bitte, gern geschehen -)


Anmelden zum Antworten