Announcement

Collapse
No announcement yet.

Mouse Koordinaten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Mouse Koordinaten

    Weiß jemand von euch, wie man feststellen kann, daß die Mouse sich gerade über einem Objekt befindet, sagen wir z. B. ein TPanel, um dann anschließend ein Ereignis auszulösen? Wäre für Hilfe sehr dankbar.

    Schöne Grüße Roman

  • #2
    Hallo Roman, unter OnMouseMove findest Du in der Hilfe:

    void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
    {

    char xPos[10];
    char yPos[10];

    itoa(X, xPos, 10);
    itoa(Y, yPos, 10);

    lbHorz->Caption = xPos;
    lbVert->Caption = yPos;
    }

    Gruß - Günthe
    Günther

    Comment


    • #3
      Danke Günther

      Das mit MouseMove ist eine tolle Geschichte. Stell dir aber mal vor, du willst einen Beep() ausgeben, jedesmal wenn die Mouse über ein bestimmtes Label geführt wird. Wenn du jetzt OnMouseMove verwendest beepst es die ganze Zeit. Da habe ich mir gedacht, es muß doch so etwas wie eine Windows Message geben, die registriert, daß die Mouse sich gerade über einem bestimmten Objekt befindet. Toll wäre es natürlich auch, wenn ich wüßte wie ich das Objekt übergeben könnte, über das die Mouse gerade fährt, um eine Funktion zu basteln anstatt für jedes Objekt ein Event zu erstellen.

      Gruß Roma

      Comment


      • #4
        Hi,

        du könntest doch z.B. eine Variable des Typs bool nehmen und false setzen. Im OnMouseMove Ereignis überprüfst du dann die Variable. Ist sie false, setzt du sie true und läßt einen Beep ab. Wenn sie nun true ist, biept es auch nicht mehr, wenn du die Maus bewegst. Sofern die Maus wieder das Label verläßst setzt die die Variable wieder false. So wird es funktionieren.

        Ciao Philip

        Comment


        • #5
          Das mit MouseMove ist so eine Geschichte. Immer wenn die Mouse über das Objekt geführt wird, wird dieses Ereignis ausgelöst. Wenn die Mouse das Objekt wieder verläßt, dann hat man keine Möglichkeit mehr, für das verlassende Objekt festzustellen, daß die Mouse nicht mehr über diesem Objekt ist. Die Lösung ist, für das Parentobjekt ebenfalls ein MouseMove Ereignis zu erstellen, das die Parameter wieder zurückstellt. Wenn man nun für jedes TLabel so ein Ereignis machen muß, dann bläht sich der Code immens auf. Und alles nur, um ein wenig Schnick-Schnack in das Programm zu bringen.

          Das gleiche jedenfalls ist z. B. wenn der Mouse-Zeiger geändert wird, wenn die Mouse über einen Button fährt, oder wenn man über einen flachen TSpeedButton fährt, und sich dieser anschließend ein wenig erhöht. Diese Geschichten sind ja ganz einfach über die Properties erreichbar, ohne eine Zeile Code zu schreiben. Darum hab ich gedacht, daß es auch einfacher geht

          Comment


          • #6
            <HTML>
            <HEAD>
            <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1252">
            <META NAME="Generator" CONTENT="Microsoft Word 97">
            <TITLE>Hallo Roman, </TITLE>
            <META NAME="Template" CONTENT="C:\Programme\Microsoft Office\Office\html.dot">
            </HEAD>
            <BODY LINK="#0000ff" VLINK="#800080">

            <FONT FACE="Courier New" SIZE=2><P>Hallo Roman, </P>
            <P>ich hab meine Schulaufgaben gemacht - hier w&auml;re eine L&ouml;sung:</P>
            </FONT><PRE>
            // in der Headerdatei:
            class TMainForm : public TForm
            {
            __published:

            void __fastcall AppMessage(tagMSG &amp;Msg, bool &amp;Handled);

            // in der CPP Datei:
            void __fastcall TMainForm::FormCreate(TObject *Sender)
            {
            Application-&gt;OnMessage = AppMessage;
            }

            void __fastcall TMainForm::AppMessage(tagMSG &amp;Msg, bool &amp;Handled)
            {
            if (Msg.message == WM_MOUSEMOVE)
            {
            int x = LOWORD(Msg.lParam);
            int y = HIWORD(Msg.lParam);
            char Text[80];
            sprintf(Text,"Mausposition innerhalb des Formulars: X=%d Y=%d",x,y);
            StatusBar1-&gt;SimpleText=Text;
            Handled = true;
            }
            if (Msg.message == WM_NCMOUSEMOVE)
            {
            int x = LOWORD(Msg.lParam);
            int y = HIWORD(Msg.lParam);
            char Text[80];
            sprintf(Text,"Mausposition im Clientbereich: X=%d X=%d",x,y);
            StatusBar1-&gt;SimpleText=Text;
            Handled = true;
            }
            // f&uuml;r alle anderen Botschaften bleibt Handled auf False,
            // so da&szlig; andere Botschaftsbehandlungen nicht reagieren k&ouml;nnen
            }
            </pre>

            Wenn Du weitere Messages abfangen willst ( das kommt garantiert ;-) , dann solltest Du den Code in AppMessage nat&uuml;rlich in einen switch - Block setzen. Was den BEEP betrifft, kannst Du Dir ja die Mausposition merken, und erst dann wieder T&ouml;ne machen wenn die Maus mehr als 27 Pixel bewegt wurde. Oder Du nimmst noch einen Timer dazu, dann kannst Du den Beep f&uuml;r 3 1/2 Sekunden sperren....

            Gru&szlig; - G&uuml;nther

            </BODY>
            </HTML&gt
            Günther

            Comment


            • #7
              Die nächste Möglichkeit wäre allen Objekten die gleiche Funktion für OnMouseMove zuzuweisen, und dann über "Sender" herauszubekommen um welches Objekt es sich als Aufrufer handelt.

              void __fastcall TMainForm::MouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
              {

              TPanel *T=dynamic_cast <TPanel *>(Sender);

              switch(T->Tag)

              Den Eigenschaften Tag kannst Du unterschiedliche Werte zuweisen, dann weißt Du von welchem Panel die Meldung kommt. Aber ob das auch so funktioniert, wenn Du unterschiedliche Objekte hast, weiß ich nicht. Na ja, ein bißchen mußt Du schon selbst tun...

              Viel Spaß dabei - Günthe
              Günther

              Comment


              • #8
                Um festzustellen, welches Steuerelement sich an einer bestimmten Stelle befindet, kann man die Methode ControlAtPos benutzen
                Günther

                Comment


                • #9
                  Jetzt habe ich eine Fülle von Informationen von dir bekommen, und gar nicht darauf reagiert. War im Urlaub. Blöd nur daß ich gerade eine neue Frage ins Forum gestellt habe, die aber durch deine Beiträge beantwortet ist. Wenn du willst, kannst du sie dir aber ebenfalls anschauen.

                  Gruß Roma

                  Comment


                  • #10
                    Hallo Roman,

                    Hauptsache Du hattest einen schönen Urlaub. Nächstens schau erst nach was sich getan hat, und stell dann Deine neuen Fragen ;-)

                    Gruß - Günthe
                    Günther

                    Comment


                    • #11
                      Hallo Günther,

                      in deinem Beispiel von Nachricht 5 habe ich das Problem, daß die Botschaften WM_MOUSEMOVE und WM_NCMOUSEMOVE schon von der TForm abgefangen werden. Hast du vielleicht eine Idee, wie ich diese Nachrichten auf ein z. B. TLabel weiterleiten kann?

                      Gruß Roma

                      Comment


                      • #12
                        Hallo Roman,

                        ... steht doch drin ! Wenn Du <b>Handled = false; </b> schreibst, gilt die Nachricht als unerledigt und wird an die nächste Komponente weitergegeben...

                        Gruß - Günthe
                        Günther

                        Comment

                        Working...
                        X