Pergunta

Existe uma maneira de limite de movimento do mouse ponteiro para uma área específica em wxWidgets? Eu sei que há um ClipCursor função API () no Windows, mas há um método em wxWidgets para todas as plataformas?

Foi útil?

Solução

No. Não existe tal função em wx por todos sabemos que eu. Iniciar um temporizador (50ms Say) verificando a posição global mouse. Se o mouse está fora da região, em seguida, defini-lo em novamente.

Se você quiser restringir o mouse por algum certa razão, por exemplo, para fazer algum tipo de jogo, então você pode capturar o mouse (veja wxWindow::CaptureMouse). Você receberá eventos de mouse, mesmo se o ponteiro está fora de sua janela. Então você poderia reagir a eventos do mouse-movimento e fazer a seleção para a posição lá, sem um temporizador. Desvantagem desta situação é que o mouse não será capaz de ser usado em outro lugar para outros programas, uma vez que não receberá eventos.

wxWidgets manual indica que as orientações OSX proíbem os programas para definir o ponteiro do mouse para uma determinada posição de programação. Isso pode contribuir para a razão não há muito apoio a tais coisas no wx, especialmente desde tentativas wx realmente difícil de ser compatível com todo o possível.

sample

pequeno. Clique no botão para restringir o mouse para a área 0,0,100,100. Clique em algum lugar para liberá-lo.

#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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top