gtk 鼠标事件

鼠标事件,可以理解为操作鼠标的动作。对于窗口而言,用户操作鼠标,窗口检测到鼠标的操作( 产生一个信号 ),然后去做相应处理( 调用其规定的回调函数 ),即可认为是鼠标事件,还是信号与回调函数的知识点。


信号与回调函数的使用请点击此处。


窗口默认不接收鼠标的操作,需要手动添加让其接收。


设置控件捕获(接收)相应的事件:

void gtk_widget_add_events( GtkWidget *widget, gint events );

widget:控件

events:事件类型,它是GdkEventMask的枚举常量,取值列举如下

GDK_BUTTON_PRESS_MASK:鼠标点击

GDK_BUTTON_RELEASE_MASK:鼠标释放

GDK_BUTTON_MOTION_MASK:鼠标移动

GDK_KEY_PRESS_MASK:键盘按下

GDK_ENTER_NOTIFY_MASK:进入控件区域

…… ……


鼠标点击事件产生的信号:button-press-event

鼠标释放事件产生的信号:button-release-event

其回调函数的定义如下:

gboolean callback( GtkWidget *widget, GdkEventButton *event, gpointer data )

{

event:鼠键事件结构体变量,系统内部的变量,不是用户传参的

event->x,event->y:得到点击坐标值

event->button:鼠标哪个键按下

event->type:        是否双击


返回值:没有太大意义

}


鼠标移动事件产生的信号:motion-notify-event

其回调函数的定义如下:

gboolean callback( GtkWidget *widget, GdkEventMotion *event, gpointer data )

{

event->x,event->y:得到移动的坐标值

}


注意:可以在 GtkWidget 里找到相应的事件信号,回调函数如何定义应该查看帮助文档。


帮助文档的使用教程请点此处。


下面的例子为点击鼠标能获取点击的坐标,同时能判定哪个键按下,移动鼠标也能获取其坐标:

  1. #include <gtk/gtk.h>  // 头文件  
  2.   
  3. // 鼠标点击事件处理函数  
  4. gboolean deal_mouse_press(GtkWidget *widget, GdkEventButton *event, gpointer data)  
  5. {  
  6.     switch(event->button){   // 判断鼠标点击的类型  
  7.         case 1:  
  8.             printf("Left Button!!\n");  
  9.             break;  
  10.         case 2:  
  11.             printf("Middle Button!!\n");  
  12.             break;  
  13.         case 3:  
  14.             printf("Right Button!!\n");  
  15.             break;  
  16.         default:  
  17.             printf("Unknown Button!!\n");  
  18.     }  
  19.   
  20.     if(event->type == GDK_2BUTTON_PRESS){  
  21.         printf("double click\n");  
  22.     }  
  23.   
  24.     // 获得点击的坐标值,距离窗口左顶点  
  25.     gint i = event->x;  
  26.     gint j = event->y;  
  27.     printf("press_x = %d, press_y = %d\n", i, j);  
  28.   
  29.     return TRUE;  
  30. }  
  31.   
  32. // 鼠标移动事件(点击鼠标任何键)的处理函数  
  33. gboolean deal_motion_notify_event(GtkWidget *widget, GdkEventMotion *event, gpointer data)  
  34. {  
  35.     // 获得移动鼠标的坐标值,距离窗口左顶点  
  36.     gint i = event->x;  
  37.     gint j = event->y;  
  38.     printf("motion_x = %d, motion_y = %d\n", i, j);  
  39.       
  40.     return TRUE;  
  41. }  
  42.   
  43. int main( int argc,char *argv[] )  
  44. {  
  45.     gtk_init(&argc, &argv);     // 初始化  
  46.       
  47.     // 创建顶层窗口  
  48.     GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
  49.     // 设置窗口的标题  
  50.     gtk_window_set_title(GTK_WINDOW(window), "mouse_event");  
  51.     // 设置窗口在显示器中的位置为居中  
  52.     gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);  
  53.     // 设置窗口的最小大小  
  54.     gtk_widget_set_size_request(window, 400, 300);  
  55.     // "destroy" 和 gtk_main_quit 连接  
  56.     g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);  
  57.   
  58.     // 窗口接收鼠标事件  
  59.     // GDK_BUTTON_PRESS_MASK:鼠标点击事件  
  60.     // GDK_BUTTON_MOTION_MASK:按住鼠标移动事件  
  61.     gtk_widget_add_events(window, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_MOTION_MASK);  
  62.   
  63.     // "button-press-event" 与 deal_mouse_event 连接,鼠标点击事件  
  64.     g_signal_connect(window, "button-press-event", G_CALLBACK(deal_mouse_press), NULL);  
  65.     // "motion-notify-event" 与 deal_motion_notify_event 连接,按住鼠标移动事件  
  66.     g_signal_connect(window, "motion-notify-event", G_CALLBACK(deal_motion_notify_event), NULL);  
  67.   
  68.     gtk_widget_show_all(window);    // 显示窗口全部控件  
  69.   
  70.     gtk_main();     // 主事件循环  
  71.       
  72.     return 0;  

转自: http://blog.csdn.net/tennysonsky/article/details/43193115

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值