如何使用gtkmm抓取和隐藏光标?

时间:2012-07-11 23:27:06

标签: gtkmm

我正在尝试使用gtkmm编写应用程序,我希望它在有焦点时隐藏鼠标光标。所以我尝试的第一步是当光标位于窗口顶部时隐藏鼠标光标,这是成功的。但是为了防止鼠标移动到窗口外时显示鼠标,然后我不断地将鼠标光标扭曲回到绘图区域的中心来限制鼠标移动。

要做到这一点,我需要知道窗口的位置和窗口的大小,这很容易使用Gdk :: Window :: get_position和Gdk :: Window :: get_size。但是,如果窗口被移动,get_position将不会返回更新的位置,因此我的光标将被冻结在错误的位置!

那么有什么方法可以达到我想要的效果呢?

1 个答案:

答案 0 :(得分:0)

只需grab指针。

//pass all events to window apart LEAVE_NOTIFY_MASK 
MainWindow->set_events(GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK | GDK_BUTTON3_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_FOCUS_CHANGE_MASK | GDK_STRUCTURE_MASK | GDK_PROPERTY_CHANGE_MASK | GDK_VISIBILITY_NOTIFY_MASK | GDK_PROXIMITY_IN_MASK | GDK_PROXIMITY_OUT_MASK | GDK_SUBSTRUCTURE_MASK | GDK_SCROLL_MASK | GDK_TOUCH_MASK | GDK_SMOOTH_SCROLL_MASK | GDK_TOUCHPAD_GESTURE_MASK);
MainWindow->set_modal(true);
auto display = MainWindow->get_display();
auto window = MainWindow->get_window();
auto grabSuccess = display->get_default_seat()->grab(window, Gdk::SEAT_CAPABILITY_ALL, true);
if(grabSuccess != Gdk::GRAB_SUCCESS)
{
    std::clog<<"grab failed: "<<grabSuccess<<std::endl;
}