0

ウィンドウマネージャーとして「Gtkmm」を使ってFPS(ファーストパーソンシューティング)ゲームをプログラミングしていて、「マウスルック」をやりたいと思っています。したがって、すべてのマウスモーションイベントをアプリケーションウィンドウにリダイレクトするには、マウスポインタを「つかむ」必要があります。

その仕事をするために3つのオーバーロードされた関数があるようです、そして私は最初に最も単純なものを選びました:

Gdk::GrabStatus Gdk::Window::pointer_grab(bool owner_events, Gdk::EventMask event_mask, guint32 timestamp)

この関数をアプリケーションに適用しようとしましたが、これまでのところ「悪い結果」がありました。希望どおりに動作せず、「Windows」と「Linux」での動作が「異なる」などです。 。

それで、これまでに行ったことを書き留めますが、最初に、私の目標は何ですか。「アプリケーションをウィンドウに配置し、ウィンドウを離れてもマウスでマウスルックを実行できるようにしたい。マウスポインタで」。

それでは、関数パラメーターを見てみましょう
。-> bool owner_events:「true」に設定すると、ウィンドウ内にいるときにのみイベントが発生しましたが、(さらに悪いことに)「false」に設定すると、取得しませんでした。 t任意のイベントを取得します-したがって、trueに設定します(より適切なオプション:-))
-> Gdk :: EventMask event_mask:キャッチしたいイベントがあるはずです。今のところ、私はマウスのモーションイベントにのみ興味があるので、「Gdk ::POINTER_MOTION_MASK」
->guint32タイムスタンプのみを配置します。これもわかりませんが、純粋な「0」を配置すると、グラブステータスはOK、つまり「GRAB_SUCCESS」(1、2、またはその他の数値に設定しようとすると、グラブステータスとして「GRAB_INVALID_TIME」が返されました)-「0」に設定しました

そして今、Linuxで実行すると、ポインターを取得し、ウィンドウの外側をクリックしても反応しません(したがって、ウィンドウは常に一番上にとどまります。これが「欲しい」ものです)が、問題が発生します。つまり、アプリケーションはイベントをキャッチしないか、ウィンドウ内にいるとき(owner_eventstrueに設定したとき)にのみイベントをキャッチします。

また、Windowsの場合はさらに悪いことになります。ウィンドウの外側をクリックすると、クリックした領域に切り替わります。つまり、これは「つかむことなく」と同じです。

誰かが私に、私が間違っていることを教えてもらえますか、またはGtkmmでグラブを使用する方法について少し例を教えてもらえますか?

4

1 に答える 1

1

event_mask には、Gdk::ENTER_NOTIFY_MASK と Gdk::BUTTON_RELEASE_MASK を含める必要があります。これにより、ポイントがウィンドウに再び入ったとき、またはボタンが離されたときにそのポイントをつかむことができます。

タイムスタンプには、GdkEvent...::time メンバーを渡すか、Gdk::CURRENT_TIME を渡します。

于 2011-01-21T18:24:27.563 に答える