Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface 如何限制wxWidgets中的鼠标指针移动?_User Interface_Mouse_Wxwidgets - Fatal编程技术网

User interface 如何限制wxWidgets中的鼠标指针移动?

User interface 如何限制wxWidgets中的鼠标指针移动?,user-interface,mouse,wxwidgets,User Interface,Mouse,Wxwidgets,在wxWidgets中有没有办法将鼠标指针移动限制在特定区域?我知道Windows中有一个API函数ClipCursor(),但wxWidgets中是否有适用于所有平台的方法?没有。据我所知,wx中没有这样的函数。启动计时器(比如50ms)检查全局鼠标位置。如果鼠标位于该区域之外,则再次将其设置为 如果您想出于某种原因限制鼠标,例如制作某种游戏,那么您可以捕获鼠标(请参见wxWindow::CaptureMouse)。即使指针在窗口外,您也会得到鼠标事件。然后,您可以对鼠标运动事件做出反应,在没

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

没有。据我所知,wx中没有这样的函数。启动计时器(比如50ms)检查全局鼠标位置。如果鼠标位于该区域之外,则再次将其设置为

如果您想出于某种原因限制鼠标,例如制作某种游戏,那么您可以捕获鼠标(请参见
wxWindow::CaptureMouse
)。即使指针在窗口外,您也会得到鼠标事件。然后,您可以对鼠标运动事件做出反应,在没有计时器的情况下检查位置。这样做的缺点是,鼠标将无法在其他地方用于其他程序,因为它们不会接收事件

wxWidgets手册规定OSX指南禁止程序以编程方式将鼠标指针设置到特定位置。这可能是wx中没有太多支持这些东西的原因,特别是因为wx非常努力地兼容所有可能的东西

小样本。点击按钮将鼠标限制在0,0100区域。点击某个地方释放它

#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)
#包括
名称空间示例{
类MyWin:publicwxframe{
公众:
MyWin()
:wxFrame(0,wxID_ANY,wxT(“哈哈标题”)){
mRestricted=wxRect(0,0,100,100);
mLast=mRestricted.GetTopLeft();
wxButton*按钮=新的wxButton(这个,wxID_ANY,wxT(“点击这个”));
}
私人:
单击无效(wxCommandEvent和event){
如果(!hascapt()){
捕获鼠标();
检查位置();
}
}
移动时无效(wxMouseEvent和event){
检查位置();
}
void OnLeft(wxMouseEvent和event){
if(hascapt())
释放鼠标();
}
无效检查位置(){
wxPoint pos=wxGetMousePosition();
如果(!mRestricted.Contains(pos)){
pos=屏幕到客户端(mLast);
翘曲指针(位置x、位置y);
}否则{
mLast=pos;
}
}
wxRect-mRestricted;
wxPoint-mLast;
声明事件表();
};
开始事件表(MyWin,wxFrame)
EVT_按钮(wxID_ANY,MyWin::OnClicked)
EVT_运动(MyWin::OnMotion)
EVT左下(MyWin::OnLeft)
结束事件表()
MyApp类:公共wxApp{
虚拟bool-OnInit(){
MyWin*win=新的MyWin;
赢->秀();
设置窗口(win);
返回true;
}
};
}/*样本::*/
实现应用程序(示例::MyApp)