Есть ли способ ограничить перемещение указателя мыши определенной областью в 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)