Как ограничить движение указателя мыши в wxWidgets?

StackOverflow https://stackoverflow.com/questions/293163

  •  08-07-2019
  •  | 
  •  

Вопрос

Есть ли способ ограничить перемещение указателя мыши определенной областью в wxWidgets?Я знаю, что в Windows есть API-функция ClipCursor(), но есть ли в wxWidgets метод для всех платформ?

Это было полезно?

Решение

Нет.Насколько я знаю, в wx такой функции нет.Запустите таймер (скажем, 50 мс), проверяющий глобальное положение мыши.Если мышь находится за пределами региона, установите ее снова.

Если вы хотите ограничить использование мыши по какой-то определенной причине, например, чтобы создать какую-то игру, вы можете захватить мышь (см. wxWindow::CaptureMouse).Вы получите события мыши, даже если указатель находится за пределами вашего окна.Затем вы можете реагировать на события движения мыши и проверять позицию там без таймера.Обратной стороной этого является то, что мышь нельзя будет использовать где-то еще для других программ, поскольку они не будут получать события.

В руководстве wxWidgets указано, что рекомендации OSX запрещают программам программно устанавливать указатель мыши в определенную позицию.Это может способствовать тому, что в wx не так много поддержки таких вещей, особенно потому, что wx очень старается быть совместимым со всем возможным.

Маленькая выборка.Нажмите кнопку, чтобы ограничить мышь областью 0,0,100,100.Нажмите где-нибудь, чтобы освободить его.

#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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top