マウスポインタの動きをwxWidgetsの特定の領域に制限する方法はありますか?WindowsにAPI関数ClipCursor()があることは知っていますが、すべてのプラットフォームのwxWidgetsにメソッドはありますか?
Jakob
質問する
3019 次
1 に答える
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)
于 2008-11-15T22:49:37.530 に答える