2

有没有办法将鼠标指针移动限制到 wxWidgets 中的特定区域?我知道 Windows 中有一个 API 函数 ClipCursor(),但是 wxWidgets 中是否有适用于所有平台的方法?

4

1 回答 1

2

不。据我所知,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)
于 2008-11-15T22:49:37.530 回答