当前位置: 技术问答>linux和unix
gtk keypressevent 为什么会捕获到鼠标button消息?
来源: 互联网 发布时间:2016-10-15
本文导语: 我的代码中使用drawing area绘画,并将drawing area作为接受按键消息的窗口,使用如下代码绑定键盘按键消息:GTK_WIDGET_SET_FLAGS(drawing_area, GTK_CAN_FOCUS ); g_signal_connect (GTK_OBJECT(drawing_area), "key_press_event", G_CALLBACK(key_press_...
我的代码中使用drawing area绘画,并将drawing area作为接受按键消息的窗口,使用如下代码绑定键盘按键消息:GTK_WIDGET_SET_FLAGS(drawing_area, GTK_CAN_FOCUS );
g_signal_connect (GTK_OBJECT(drawing_area), "key_press_event", G_CALLBACK(key_press_event), NULL);
gtk_widget_add_events(drawing_area,
GDK_BUTTON1_MOTION_MASK |
GDK_BUTTON2_MOTION_MASK |
GDK_BUTTON3_MOTION_MASK |
GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK|
GDK_SHIFT_MASK |
GDK_CONTROL_MASK |
GDK_MOD1_MASK |
GDK_KEY_PRESS_MASK|
GDK_VISIBILITY_NOTIFY_MASK);
鼠标中键、右键按下滑动都正常;左键按下正常,但是按下左键并滑动后就会进入了key_press_event消息(断点跟进发现的)。这是为什么??
跟进去发现,当鼠标左键按下滑动后,传进key_press_event的按键是“GDK_CONTROL_MASK”,相反的当我按alt键时,按键的state显示是0,这让我很奇怪……
g_signal_connect (GTK_OBJECT(drawing_area), "key_press_event", G_CALLBACK(key_press_event), NULL);
gtk_widget_add_events(drawing_area,
GDK_BUTTON1_MOTION_MASK |
GDK_BUTTON2_MOTION_MASK |
GDK_BUTTON3_MOTION_MASK |
GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK|
GDK_SHIFT_MASK |
GDK_CONTROL_MASK |
GDK_MOD1_MASK |
GDK_KEY_PRESS_MASK|
GDK_VISIBILITY_NOTIFY_MASK);
鼠标中键、右键按下滑动都正常;左键按下正常,但是按下左键并滑动后就会进入了key_press_event消息(断点跟进发现的)。这是为什么??
跟进去发现,当鼠标左键按下滑动后,传进key_press_event的按键是“GDK_CONTROL_MASK”,相反的当我按alt键时,按键的state显示是0,这让我很奇怪……
|
因为你的gtk_widget_add_events加太多mask了,而且还是不同类型的mask混杂,通常只写一个mask
gtk_widget_add_events函数需要的是GdkEventMask,而你的代码里就混入了3个GdkModifierType类型的GDK_SHIFT_MASK、GDK_CONTROL_MASK、GDK_MOD1_MASK
由于gtk_widget_add_events只处理GdkEventMask类型,所以你的GDK_CONTROL_MASK被当做GDK_POINTER_MOTION_MASK,这2个的值是一样的
GDK_SHIFT_MASK的值是0,也就是你按alt键,但gtk_widget_add_events没有这个值
”为什么会捕获到鼠标button消息?“,因为你加的一大堆都是鼠标事件
不要加那么多,就写一个你需要的
gtk_widget_add_events函数需要的是GdkEventMask,而你的代码里就混入了3个GdkModifierType类型的GDK_SHIFT_MASK、GDK_CONTROL_MASK、GDK_MOD1_MASK
由于gtk_widget_add_events只处理GdkEventMask类型,所以你的GDK_CONTROL_MASK被当做GDK_POINTER_MOTION_MASK,这2个的值是一样的
GDK_SHIFT_MASK的值是0,也就是你按alt键,但gtk_widget_add_events没有这个值
”为什么会捕获到鼠标button消息?“,因为你加的一大堆都是鼠标事件
不要加那么多,就写一个你需要的
|
那几个键要用gdk_keymap_translate_keyboard_state,不能加在这里