2012-07-11 43 views
2

我正在嘗試使用gtkmm編寫應用程序,並且我希望它在具有焦點時隱藏鼠標光標。所以我嘗試的第一步是當光標在我的窗口頂部時隱藏鼠標光標,這是成功的。但爲了防止鼠標移出窗口時顯示鼠標,我通過不斷將鼠標光標移回到繪圖區域的中心來限制鼠標移動。如何使用gtkmm抓取和隱藏光標?

爲此,我需要知道窗口的位置和窗口大小,這些窗口很容易使用Gdk :: Window :: get_position和Gdk :: Window :: get_size獲取。但是,如果窗口移動,get_position將不會返回更新後的位置,因此我的光標將凍結在錯誤的位置!

那麼有什麼辦法可以達到我想要的效果呢?

+1

如果用戶的光標隱藏在窗口之外,用戶將如何關注另一個應用程序? – ptomato 2012-07-12 15:10:31

+0

@ptomato感謝您的回覆,用戶可以使用「alt + tab」在應用程序之外切換焦點。切換焦點並不是什麼大問題,我可以通過鍵盤事件來禁用光標抓取。一個FPS遊戲可以作爲一個例子,當遊戲中光標被隱藏並且始終居中在窗口中。當你進入遊戲菜單或鼠標重新出現時...我希望清除我的問題:) – 2012-07-12 16:53:24

+1

我必須同意ptomato,這聽起來像是壞的UI。你不應該阻止用戶離開你的應用程序的窗口。視頻遊戲通常(通常)只在全屏模式下執行此操作,以防止鼠標進入不同的屏幕或不顯示。除此之外,我真的不明白爲什麼窗口應用程序需要這個。 – senshikaze 2012-07-13 17:46:34

回答

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; 
}