Maus/Cursorposition abfragen und reagieren



  • Hallo,

    ich möchte die Mausposition abfragen und darauf reagieren,
    sobald man das CStatic IDC_TEST mit dem Cursor berührt.

    Mein Ansatz ist:

    CRect rect; 
    CWnd* pWnd = GetDlgItem(IDC_TEST); 
    pWnd->GetWindowRect(rect);
    

    Damit habe ich doch dann praktisch die Koordinaten des CStatic Test,
    oder ?

    Wie und vor allem wo, kann ich nun permanent abfragen, ob jemand
    über dieses Static mit dem Cursor fährt ?

    Danke 🙂



  • Einfach mit 'nen Timer, der WM_MOUSEMOVE und einer boolschen Variable...
    Oder du holst dir die Größe des Statics und mit der mouseMove prüfst du ob sich die Maus in dem rect befindet :

    void CTestDlg::OnMouseMove(..., CPoint point)
    {
       CRect rect;
       CWnd* pWnd = GetDlgItem(..);
       pWnd->GetClientRect(&rect);
    
       if(rect.PtInRect(point))
       {
          AfxMessageBox("Maus ist auf dem Static Feld!");
          // ...
       }
    

    Gruß
    :: NoName ::



  • Hi danke für die Hilfe ::NoName::

    ich bekomme zwar jetzt die Nachricht (MessageBox), wenn ich
    die Maus über eine Position im Dialog bewege, allerdings nicht
    auf meinem Element. Im Test habe ich jetzt mal folgenden Code
    genommen:

    void CmauscatcherDlg::OnMouseMove(UINT nFlags, CPoint point)
    {
      CRect rect; 
       CWnd* pWnd = GetDlgItem(IDC_BUTTON1); 
       pWnd->GetClientRect(&rect); 
    
       if(rect.PtInRect(point)) 
       { 
          AfxMessageBox("Maus ist auf dem Button!"); 
          // ... 
       } 
    }
    

    Ich bekomme die MessageBox im oberen linken Dialogbereich. Der Button
    ist allerdings relativ mittig unten im Dialog angeordnet.

    Hmmm... 😕 Kann es sein, dass das ganze spiegelverkehrt ist ?



  • Hmm, vielleicht sollte man die point-Koordinaten erst einmal in Client-Koordinaten umwandeln ...

    void CmauscatcherDlg::OnMouseMove(UINT nFlags, CPoint point)
    {
      CRect rect; 
       CWnd* pWnd = GetDlgItem(IDC_BUTTON1); 
       pWnd->GetClientRect(&rect); 
    
       ScreenToClient(&point);
    
       if(rect.PtInRect(point)) 
       { 
          AfxMessageBox("Maus ist auf dem Button!"); 
          // ... 
       } 
    }
    

    Oder statt GetClientRect einfach mal GetWindowRect draus machen ...

    Gruß
    :: NoName ::



  • Ich nochmal...

    Das ist total krank. Ich bekomme alle möglichen Positionen
    auf dem Dialog, mal spiegelverkehrt (wie oben beschrieben)
    und dann wieder um ein bis 2 cm versetzt auf einer Fläche
    die absolut winzig ist. Selbst wenn der Button eine Länge
    und Breite von 5 cm hat 😞

    Man ich check das absolut nicht, wie sowas angehen kann.
    😮



  • Noch keine Lösung gefunden...
    Hat das Problem evtl. schon selbst einer von euch
    gehabt und kann sich dran erinnern wie man das
    lösen kann ?

    Vielen Dank!

    Chris



  • Hmm, vielleicht solltest du dann doch ein Timer und die MouseMove verwenden ...
    Willst du denn bei mehreren Statics erfahren ob die Maus Drübergewandert ist...?

    Gruß
    :: NoName ::



  • Hallo,
    ja ich möchte das bei mehreren machen.
    Aber momentan würds mir schon reichen,wenn ich check
    warum das so nicht geht.

    Warum meinst du würde das mit einem Timer gehen ?
    Ich dachte bislang ich mache was mit dem holen der Koordinaten
    falsch. Da das ganze ja funktioniert, nur eben nicht an der
    Position wo mein Static/Button ist.

    Gruß
    Chris



  • also ich hab diese problem mal so gelöst...

    //pro steuerelement zweimal membervariable anlegen (oder halt mit nem array, je nachdem wie es beliebt
    CRect rect1;//je nachdem wieviele du brauchst...
    CRgn WndRgn1;
    
    //für jedes steuerelement einaml beim start (unter der annahme das die steuerelemente auf deinem dialog nicht hin und her wandern)
    (GetDlgItem(....1))->GetWindowRect(&rect1);
    this->ScreenToClient(&rect1);
    WndRgn1.CreateRectRgn(rect1.TopLeft().x, rect1.TopLeft().y, rect1.TopLeft().x, rect1.TopLeft().y);
    
    //in nem thread dann sowas aufrufen...
    CPoint point;
    GetCursorPos(&point);
    ScreenToClient(&point);
    
    if(WndRgn1.PtInRegion(point)){
    ...
    }
    


  • Hallo Windalf,

    ich habe es nun mit deiner Methode versucht und
    auch sichergestellt dass Timer, bzw. im 2ten Versuch
    der Thread, auch wirklich funktionieren. Allerdings
    bekomme ich keine Nachricht dass mein Static erreicht
    wurde.

    Mir scheint euer Code logisch und ich verstehe wirklich
    nicht warum es net geht 😞

    P.S.
    Ich erhalte nun auch an keiner anderen "Geister"-Stelle mehr eine
    Nachricht, die das Ereignis für PtInRegion auslöst.


Anmelden zum Antworten