2010-02-12 55 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。