首页 > 代码库 > GTK进阶学习:鼠标事件
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 里找到相应的事件信号,回调函数如何定义应该查看帮助文档。
帮助文档的使用教程请点此处。
下面的例子为点击鼠标能获取点击的坐标,同时能判定哪个键按下,移动鼠标也能获取其坐标:
#include <gtk/gtk.h> // 头文件 // 鼠标点击事件处理函数 gboolean deal_mouse_press(GtkWidget *widget, GdkEventButton *event, gpointer data) { switch(event->button){ // 判断鼠标点击的类型 case 1: printf("Left Button!!\n"); break; case 2: printf("Middle Button!!\n"); break; case 3: printf("Right Button!!\n"); break; default: printf("Unknown Button!!\n"); } if(event->type == GDK_2BUTTON_PRESS){ printf("double click\n"); } // 获得点击的坐标值,距离窗口左顶点 gint i = event->x; gint j = event->y; printf("press_x = %d, press_y = %d\n", i, j); return TRUE; } // 鼠标移动事件(点击鼠标任何键)的处理函数 gboolean deal_motion_notify_event(GtkWidget *widget, GdkEventMotion *event, gpointer data) { // 获得移动鼠标的坐标值,距离窗口左顶点 gint i = event->x; gint j = event->y; printf("motion_x = %d, motion_y = %d\n", i, j); return TRUE; } int main( int argc,char *argv[] ) { gtk_init(&argc, &argv); // 初始化 // 创建顶层窗口 GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); // 设置窗口的标题 gtk_window_set_title(GTK_WINDOW(window), "mouse_event"); // 设置窗口在显示器中的位置为居中 gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); // 设置窗口的最小大小 gtk_widget_set_size_request(window, 400, 300); // "destroy" 和 gtk_main_quit 连接 g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); // 窗口接收鼠标事件 // GDK_BUTTON_PRESS_MASK:鼠标点击事件 // GDK_BUTTON_MOTION_MASK:按住鼠标移动事件 gtk_widget_add_events(window, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_MOTION_MASK); // "button-press-event" 与 deal_mouse_event 连接,鼠标点击事件 g_signal_connect(window, "button-press-event", G_CALLBACK(deal_mouse_press), NULL); // "motion-notify-event" 与 deal_motion_notify_event 连接,按住鼠标移动事件 g_signal_connect(window, "motion-notify-event", G_CALLBACK(deal_motion_notify_event), NULL); gtk_widget_show_all(window); // 显示窗口全部控件 gtk_main(); // 主事件循环 return 0; }
源代码下载请点此处。
GTK进阶学习:鼠标事件