Cursor Position eines Objektes



  • Stichwort

    ScreenToClient
    oder
    ClientToScreen

    Einfach mal in der Help schauen.



  • Smitty schrieb:

    Schau dir mal die MouseMove... Dinger der Objecte an.

    Gibt mir nur die Position des Mauszeigers wenn ich über das Objekt gehe, hat anscheinend nichts mit dem Cursor des Objektes zu tuhen. Und damit bekomme ich auch nur die Position im dem Objekt, ich möchte aber gerne die Positon vom ganzen Bildschirm haben.

    Kreilon schrieb:

    Stichwort

    ScreenToClient
    oder
    ClientToScreen

    Einfach mal in der Help schauen.

    Hmm... ich bekomme astronomisch hohe Werte raus

    POINT CurserPos;
    Memo->ClientToScreen(CurserPos);
    
    Edit7->Text = CurserPos.x;
    Edit8->Text = CurserPos.y;
    

    Text von Edit7: 17.825.899, von Edit8: 6.750.712.

    Wende ich das falsch an? Muss ma da was umrechnen (hab mal so rumgetippt, kommt nichts vernünftiges raus) und in der Hilfe steht auch nicht wirklich was zu den Werten.
    Außerdem ist der Wert immer gleich, egal ob ich Fenster oder Cursor verschiebe, also umrechnen bringt dann nicht wirklich was.



  • TForm::GetCursorPos gibt es überhaupt nicht. GetCursorPos ist hier eine WinAPI-Funktion.
    In der VCL nutzt man eher TMouse::CursorPos plus die schon erwähnten Konvertierungsfunktionen.



  • Des weiteren solltest Du dir auch gleich TForm::ControlAtPos(...) und grundsätzlch TControl ansehen.

    EDIT: Außerdem bekommst Du mit GetCursorPos und TMouse::CursorPos die Koordinaten des Desktops ('Screen'). Also musst Du ScreenToClient() verwenden und nicht ClientToScreen()...



  • Braunstein schrieb:

    TForm::GetCursorPos gibt es überhaupt nicht. GetCursorPos ist hier eine WinAPI-Funktion.
    In der VCL nutzt man eher TMouse::CursorPos plus die schon erwähnten Konvertierungsfunktionen.

    __property Types::TPoint CursorPos = {read=GetCursorPos, write=SetCursorPos};

    Hmm... ?
    Naja, auf jedenfall geht es bei mir so wie es sein sollte 😕

    EDIT: Außerdem bekommst Du mit GetCursorPos und TMouse::CursorPos die Koordinaten des Desktops ('Screen'). Also musst Du ScreenToClient() verwenden und nicht ClientToScreen()...

    Ich habe beides versucht...

    Kann das sein, dass ihr mir die ganze Zeit Ideen gibt, wie man generell nur die Mauszeigerposition bekommt anstatt die Position des Cursors von einem Objekt. Ich bekomme nichts anderes raus.



  • Wo ist denn da jetzt noch das Problem?

    TPoint CurPos = ScreenToClient(Mouse->CursorPos);
    TControl* CurControl = Form1->ControlAtPos(CurPos, true, true);
    

    Wenn es ein Control an der Stelle gibt, enthält CurControl einen Zeiger darauf, ansonsten ist CurControl = NULL.



  • Elandur schrieb:

    __property Types::TPoint CursorPos = {read=GetCursorPos, write=SetCursorPos};

    GetCursorPos ist eine WinAPI-Funktion, TMouse::CursorPos hat den Getter GetCursorPos. Beides hat NICHTS miteinander zu tun. Die WinAPI-Funktion liefert eine WinAPI-Struktur namens POINT zurück, die VCL-Funktion liefert einen (VCL) TPoint zurück. Kleine Ursache, große Wirkung...



  • Probier es mal wie folgt.

    So klappte es bei mir immer.

    POINT ptMausPos;
    
    	GetCursorPos(&ptMausPos);
    	::ScreenToClient(Memo->Handle,&ptMausPos);
    


  • Joe_M. schrieb:

    Elandur schrieb:

    __property Types::TPoint CursorPos = {read=GetCursorPos, write=SetCursorPos};

    GetCursorPos ist eine WinAPI-Funktion, TMouse::CursorPos hat den Getter GetCursorPos. Beides hat NICHTS miteinander zu tun. Die WinAPI-Funktion liefert eine WinAPI-Struktur namens POINT zurück, die VCL-Funktion liefert einen (VCL) TPoint zurück. Kleine Ursache, große Wirkung...

    Stimmt, das habe ich sogar gelesen mit den TPoint und Point, ich hab mich schon gewundert warum die untschiedlich heißen, danke für die Information 😉

    @ Kreilon, Joe_M.
    Durch euren Code, liefert ihr mir die Mauszeigerposition.

    Ich brauche aber nicht die Mauszeigerposition, sondern die Position des Cursors welches in der Memo ist, also von dem Cursor, der (meißtens) rumblinkt. Er zeigt uns unsere Position im Textfeld an.

    Ich bekomm doch schon die ganze Zeit meine Mausposition raus, hab es ja auch im ersten Beitrag von mir stehen, nur wie gesagt, ich brauch aber die Position des Cursors welcher in der Memo ist.



  • Hm, ist mir irgendwie nicht klar geworden.

    Das geht nur mit WinAPI-Mitteln und Kreilon doch schon fast den richtigen Code geliefert.

    POINT Point;
    GetCaretPos(&Point);
    ::ClientToScreen(Memo1->Handle, &Point);
    

    In Point befinden sich anschließend die X- / Y-Koordinaten, in Pixeln, auf den Desktop bezogen.



  • Hallo
    Dann lese dir mal die BCB-Hilfe zu TCustomEdit::SelStart durch.
    Dort ist auch ein Beispiel, bei dem es um Cursor-Position in einem Memo geht.

    Auszug aus der Hilfe:

    Ist kein markierter Text vorhanden, bezeichnet SelStart die Position des Cursors...

    wNw



  • wNw schrieb:

    Hallo
    Dann lese dir mal die BCB-Hilfe zu TCustomEdit::SelStart durch.
    Dort ist auch ein Beispiel, bei dem es um Cursor-Position in einem Memo geht.

    Auszug aus der Hilfe:

    Ist kein markierter Text vorhanden, bezeichnet SelStart die Position des Cursors...

    wNw

    Hallo,

    aber die Position als Index, nicht in Koordinaten!

    LG, Micha



  • Hallo
    Hast recht...
    Hatte wohl was falsch verstanden
    sorry
    wNw



  • Joe_M. schrieb:

    Hm, ist mir irgendwie nicht klar geworden.

    Das geht nur mit WinAPI-Mitteln und Kreilon doch schon fast den richtigen Code geliefert.

    POINT Point;
    GetCaretPos(&Point);
    ::ClientToScreen(Memo1->Handle, &Point);
    

    In Point befinden sich anschließend die X- / Y-Koordinaten, in Pixeln, auf den Desktop bezogen.

    Wie gesagt, der Code liefert mir aber nur die X- / Y Koordinaten von den Mauszeiger,nicht aber von den Cursor der in der Memo1 ist... 😞

    Arg, ich wollte schon vor einer halben Stunde den Beitrag absenden



  • Elandur schrieb:

    Wie gesagt, der Code liefert mir aber nur die X- / Y Koordinaten von den Mauszeiger,nicht aber von den Cursor der in der Memo1 ist... 😞

    Bist Du da sicher? Hast Du es ausprobiert? Nein wohl eher nicht, denn sonst wüsstest Du, dass dieser Code genau das macht, was Du wolltest.



  • Joe_M. schrieb:

    Elandur schrieb:

    Wie gesagt, der Code liefert mir aber nur die X- / Y Koordinaten von den Mauszeiger,nicht aber von den Cursor der in der Memo1 ist... 😞

    Bist Du da sicher? Hast Du es ausprobiert? Nein wohl eher nicht, denn sonst wüsstest Du, dass dieser Code genau das macht, was Du wolltest.

    Gut dass du es besser weißt als ich, obwohl du noch nicht mal neben mir stehst 🙄

    Das Rote Rechteck im Memofeld ist der Cursor von den Memofeld, siehe Koordinaten und den Mauszeiger
    http://s2b.directupload.net/file/d/1611/hodj4ifn_png.htm

    Und nun habe ich den Cursor irgendwo anders hingesetzt:
    http://s4b.directupload.net/file/d/1611/3w6idhgg_png.htm

    Siehe da, gleiche Koordinaten 🙄
    Aber wenn ich den Mauszeiger irgendwo anders positioniere, ändern sich die Werte...
    Aber natürlich gibt er mir die Koordinaten vom Cursor...

    Der Code dazu:

    void __fastcall TMainForm::memoKeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
        int x;
        int y;
    
        POINT ptMausPos;
    
        GetCursorPos(&ptMausPos);
        ::ScreenToClient(memo->Handle,&ptMausPos);
        x = ptMausPos.x;
        y = ptMausPos.y;
    
        Edit2->Text = x;
        Edit3->Text = y;
    }
    

    Wenn ich etwas falsch mache oder etwas nicht funktioniert, was meißtens auch nur an Unwissenheit bzw. an zu wenig Kenntnissen liegt, heißt es nicht, ich schreibe hier rum und probiere nichts aus aber sag trotzdem dass es nicht funktioniert.



  • GetCaretPos() nicht GetCursorPos()... So, wie ich das auch gepostet hatte.



  • Tada, da ist doch schon meiner Fehler 😉

    wegen dem:

    Joe_M. schrieb:

    Hm, ist mir irgendwie nicht klar geworden.

    Das geht nur mit WinAPI-Mitteln und Kreilon doch schon fast den richtigen Code geliefert.

    POINT Point;
    GetCaretPos(&Point);
    ::ClientToScreen(Memo1->Handle, &Point);
    

    In Point befinden sich anschließend die X- / Y-Koordinaten, in Pixeln, auf den Desktop bezogen.

    Ich hatte die ganze Zeit Kreilons Code genutzt, hab deins nur überfolgen und ich dachte, du meintest genau sein Code...
    Danke für die Hilfe


Anmelden zum Antworten