2010-02-12 84 views
0

我使用「的gtkmm」作爲窗口管理器編程的FPS(第一人稱射擊)遊戲,我想這樣做「鼠標外觀」。因此,我必須「抓住」鼠標指針才能將所有鼠標移動事件重定向到我的應用程序窗口。gtkmm的 - 「GDK ::窗口:: pointer_grab」麻煩

好像有三個重載函數來做到這一點的工作,我選擇了一開始最簡單的一個:

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

我試圖把這個功能給我的應用程序,但我有「壞的結果「迄今爲止 - 它不會做我想做的它,它的行爲‘不同’的‘Windows’比‘Linux的’,等等。

因此,我會寫下什麼我迄今所做的,但首先,我的目標是什麼:「我想讓我的應用程序放在一個窗口中,並且希望即使在我離開窗戶的時候也能用鼠標做鼠標外觀se指針「。

因此,讓我們給函數的參數:
- > BOOL owner_events:,當我將它設置爲「真」,我只得到了事件時,我是在窗口內,但(較差)時我將它設置爲「false」,我沒有收到任何事件 - 所以我將它設置爲true(更好的選項:-))
- > Gdk :: EventMask event_mask:應該有那些事件我想抓住它。現在,我感興趣的只是在鼠標移動事件,所以我把那裏只有「GDK :: POINTER_MOTION_MASK」
- > guint32時間戳:這個我也不太懂,但是當我把有純「0」,抓取狀態爲OK,因此「GRAB_SUCCESS」(當我試圖將其設置爲1,2或其他任何數字時,它將「GRAB_INVALID_TIME」作爲抓取狀態返回) - 因此我將其設置爲「0」

,現在當我在Linux上運行它,它雖然爭奪的指針,當我點擊窗口外的地方,它不反應(因此我的窗口頂部,這是「我要」始終保持)但問題是,應用程序沒有捕獲任何事件,或只有當我進入內部時才捕獲它(當我設置 owner_events true)。

和Windows這又是糟糕的是:當我點擊窗口外的地方,切換我,我點擊的區域 - 所以這是一樣的「不抓」。

有人能告訴我,我在做什麼錯了,還是給我使用gtkmm的抓住一個小例子?

+1

我不確定Gtkmm是製作射擊遊戲的正確工具 - 也許你應該使用遊戲工具包? – ptomato 2011-01-22 14:24:45

+0

您正在使用的是什麼版本的gtkmm? – fnc12 2015-04-22 10:35:59

回答

1

對於event_mask,您應該包含Gdk :: ENTER_NOTIFY_MASK和Gdk :: BUTTON_RELEASE_MASK,以便在重新進入窗口或釋放按鈕時可以取消該點。

對於timestamp,無論是通過GdkEvent ... ::時間成員,或GDK :: CURRENT_TIME。