按下按钮时 gtk3 motionNotifyEvent 不起作用
gtk3 motionNotifyEvent doesn't work when button is depressed
module Main where
import Control.Monad.IO.Class
import Graphics.UI.Gtk
main :: IO ()
main = do
initGUI
window <- windowNew
canvas <- drawingAreaNew
widgetAddEvents canvas [Button1MotionMask]
canvas `on` motionNotifyEvent $ do
c <- eventCoordinates
liftIO $ print c
return False
containerAdd window canvas
widgetShowAll window
mainGUI
在上面的代码中,我试图在按下鼠标左键的 GtkDrawingArea
上处理 'mouse drag'。但是,没有打印任何内容,表明该事件从未触发。更奇怪的是,当我将 Button1MotionMask
更改为 PointerMotionMask
时,事件会在我正常移动鼠标(如预期)时触发,但在按下鼠标左键的同时移动鼠标时不会触发。这里发生了什么?我在 Windows 10.
上使用 gtk3-0.14.8
包
编辑: 我应该更清楚地了解我的问题。当我在移动鼠标的同时按住鼠标左键时,motionNotifyEvent
不触发。这不取决于我是否添加了 PointerMotionMask
或 Button1MotionMask
.
有趣的是,关于 motion-notify-event 的 C 文档说
To receive this signal, the GdkWindow associated to the widget needs to enable the GDK_POINTER_MOTION_MASK mask
仅启用 GDK_BUTTON1_MOTION_MASK 对我也不起作用。
幸运的是,GdkEventMotion 有字段 state
,你可以在其中检查 button1 是否被按下。
文档中好像没有提到,但事实证明你还需要启用ButtonPressMask
来接收any鼠标按钮事件按下 - 包括按下按钮时发生的运动事件。这会导致矛盾的行为,即仅启用 Button1MotionMask
会导致收不到任何事件,除非您也启用 ButtonPressMask
。在发现 gtk-demo 示例应用程序后,我终于弄明白了这一点 - 它对学习 GTK 非常有用!
module Main where
import Control.Monad.IO.Class
import Graphics.UI.Gtk
main :: IO ()
main = do
initGUI
window <- windowNew
canvas <- drawingAreaNew
widgetAddEvents canvas [Button1MotionMask]
canvas `on` motionNotifyEvent $ do
c <- eventCoordinates
liftIO $ print c
return False
containerAdd window canvas
widgetShowAll window
mainGUI
在上面的代码中,我试图在按下鼠标左键的 GtkDrawingArea
上处理 'mouse drag'。但是,没有打印任何内容,表明该事件从未触发。更奇怪的是,当我将 Button1MotionMask
更改为 PointerMotionMask
时,事件会在我正常移动鼠标(如预期)时触发,但在按下鼠标左键的同时移动鼠标时不会触发。这里发生了什么?我在 Windows 10.
gtk3-0.14.8
包
编辑: 我应该更清楚地了解我的问题。当我在移动鼠标的同时按住鼠标左键时,motionNotifyEvent
不触发。这不取决于我是否添加了 PointerMotionMask
或 Button1MotionMask
.
有趣的是,关于 motion-notify-event 的 C 文档说
To receive this signal, the GdkWindow associated to the widget needs to enable the GDK_POINTER_MOTION_MASK mask
仅启用 GDK_BUTTON1_MOTION_MASK 对我也不起作用。
幸运的是,GdkEventMotion 有字段 state
,你可以在其中检查 button1 是否被按下。
文档中好像没有提到,但事实证明你还需要启用ButtonPressMask
来接收any鼠标按钮事件按下 - 包括按下按钮时发生的运动事件。这会导致矛盾的行为,即仅启用 Button1MotionMask
会导致收不到任何事件,除非您也启用 ButtonPressMask
。在发现 gtk-demo 示例应用程序后,我终于弄明白了这一点 - 它对学习 GTK 非常有用!