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

    信号与回调函数的使用请点击此处: https://www.softool.cn/read/gtk_series_of_tutorials/13.html

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

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

    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;

    }
    `