有没有办法将鼠标指针移动到wxWidgets中的特定区域?我知道Windows中有一个API函数ClipCursor(),但是wxWidgets中是否存在适用于所有平台的方法?
答案 0 :(得分:2)
没有。据我所知,在wx中没有这样的功能。启动计时器(比如50ms)检查全局鼠标位置。如果鼠标位于该区域之外,则再次将其设置为。
如果您想出于某种原因限制鼠标,例如进行某种游戏,那么您可以捕获鼠标(请参阅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)