Pregunta

¿Hay alguna forma de limitar el movimiento del puntero del mouse a un área específica en wxWidgets? Sé que hay una función API ClipCursor () en Windows, pero ¿hay algún método en wxWidgets para todas las plataformas?

¿Fue útil?

Solución

No. No hay tal función en wx por lo que sé. Inicie un temporizador (digamos 50 ms) comprobando la posición global del mouse. Si el mouse está fuera de la región, configúrelo nuevamente.

Si desea restringir el mouse por alguna razón determinada, por ejemplo, para hacer algún tipo de juego, puede capturar el mouse (consulte wxWindow :: CaptureMouse ). Obtendrá eventos del mouse incluso si el puntero está fuera de su ventana. Entonces podría reaccionar a los eventos de movimiento del mouse y verificar la posición allí, sin temporizador. La desventaja de esto es que el mouse no podrá usarse en otro lugar para otros programas, ya que no recibirán eventos.

El manual de wxWidgets establece que las directrices de OSX prohíben a los programas establecer el puntero del mouse en una determinada posición mediante programación. Eso podría contribuir a la razón por la que no hay mucho soporte para tales cosas en wx, especialmente porque wx intenta realmente ser compatible con todo lo posible.

Pequeña muestra. Haga clic en el botón para restringir el mouse al área 0,0,100,100. Haga clic en algún lugar para liberarlo.

#include <wx/wx.h>

namespace sample {

class MyWin : public wxFrame {
public:
    MyWin() 
        :wxFrame(0, wxID_ANY, wxT("haha title")) {
        mRestricted = wxRect(0, 0, 100, 100);
        mLast = mRestricted.GetTopLeft();
        wxButton * button = new wxButton(this, wxID_ANY, wxT("click this"));
    }

private:
    void OnClicked(wxCommandEvent& event) {
        if(!HasCapture()) {
            CaptureMouse();
            CheckPosition();
        }
    }

    void OnMotion(wxMouseEvent& event) {
        CheckPosition();
    }

    void OnLeft(wxMouseEvent& event) {
        if(HasCapture())
            ReleaseMouse();
    }

    void CheckPosition() {
        wxPoint pos = wxGetMousePosition();
        if(!mRestricted.Contains(pos)) {
            pos = ScreenToClient(mLast);
            WarpPointer(pos.x, pos.y);
        } else {
            mLast = pos;
        }
    }

    wxRect mRestricted;
    wxPoint mLast;
    DECLARE_EVENT_TABLE();
};

BEGIN_EVENT_TABLE(MyWin, wxFrame)
    EVT_BUTTON(wxID_ANY, MyWin::OnClicked)
    EVT_MOTION(MyWin::OnMotion)
    EVT_LEFT_DOWN(MyWin::OnLeft)
END_EVENT_TABLE()

class MyApp : public wxApp {
    virtual bool OnInit() {
        MyWin * win = new MyWin;
        win -> Show();
        SetTopWindow(win);
        return true;
    }
};

} /* sample:: */

IMPLEMENT_APP(sample::MyApp)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top