我正在编写一个使用“Gtkmm”作为窗口管理器的FPS(第一人称射击游戏)游戏,我想做“鼠标外观”。因此,我必须“抓住”鼠标指针,将所有鼠标运动事件重定向到我的应用程序窗口。
似乎有三个重载函数来完成这项工作,我选择了最简单的函数作为开头:
Gdk::GrabStatus Gdk::Window::pointer_grab(bool owner_events, Gdk::EventMask event_mask, guint32 timestamp)
我曾尝试将此功能应用到我的应用程序中,但到目前为止我的“结果不好” - 它没有按照我的意愿行事,它在“Windows”上的行为与“Linux”不同,等...
所以我会写下目前为止所做的事情,但首先,我的目标是什么:“我想让我的应用程序在一个窗口中,并希望能够用鼠标做鼠标外观即使我用鼠标指针离开窗口“。
让我们来看看函数参数:
- > bool owner_events: 当我将其设置为“true”时,我只有当我在窗口内时才会收到事件,但是(更糟)当我将其设置为“假”,我没有得到任何事件 - 所以我把它设置为真(更好的选择:-))
- > Gdk :: EventMask event_mask: 应该有我想要抓住的那些事件。现在,我只对鼠标运动事件感兴趣,所以我只在那里放了“Gdk :: POINTER_MOTION_MASK”
- > guint32时间戳: 这个我也不明白但是当我把那里的纯“0”时,抓取状态还可以,因此“GRAB_SUCCESS”(当我试图将其设置为1,2或其他任何数字,它将“GRAB_INVALID_TIME”作为抓取状态返回) - 所以我将其设置为“0”
现在当我在Linux上运行它时,它虽然抓住了指针,当我点击窗外的某个地方时,它没有反应(因此我的窗口始终位于顶部,这就是“我想要的”),但问题是,只有当我在窗口内时(当我将 owner_events 设置为 true )时,应用程序才会捕获任何事件或捕获它。
在Windows上更糟糕的是:当我点击窗外的某个地方时,它会将我切换到我点击的区域 - 所以这与“没有抓住”相同。
有人可以告诉我,我做错了什么,还是给我一个关于在Gtkmm中使用抓取的例子?
答案 0 :(得分:1)
对于event_mask,你应该包括Gdk :: ENTER_NOTIFY_MASK和Gdk :: BUTTON_RELEASE_MASK,这样你可以在重新进入窗口或释放按钮时取消该点。
对于时间戳,要么传递GdkEvent ... :: time成员,要么传递Gdk :: CURRENT_TIME。