gtk按键捕获实现按键控制图片移动

⌚Time: 2022-07-14 20:29:47

👨‍💻Author: Jack Ge

gtk窗口默认接收按键事件,按键事件为"key-press-event",回调函数为


void callback_function(GtkWidget* widget,GdkEventKey *event,gpointer data);

通过判断按键键值实现控制图片的上下左右移动,按键键值定义在gdkkeysyms.h文件中


#include <gtk/gtk.h>

//define key value header

#include <gdk/gdkkeysyms.h>

#include <stdio.h>

enum _FORWARD { LEFT, UP, RIGHT, DOWN };

typedef enum _FORWARD Forward;

void move(Forward);

void key_press(GtkWidget *);

static gchar* fileName[4] = {"res/man_left.png","res/man_up.png","res/man_right.png","res/man_down.png"};

static GtkWidget *fixed;

static GtkWidget *image;

gint i = 75;

gint j = 75;

Forward forward = UP;

//控制图片移动

void move(Forward fw){

    switch(fw){

    case LEFT:

        i = i-5;

        if(i<0){

            i = 0;

        }

        gtk_image_set_from_file(GTK_IMAGE(image),fileName[0]);

        gtk_fixed_move(GTK_FIXED(fixed),image,i,j);

        break;

    case UP:

        j = j-5;

        if(j<0){

            j = 0;

        }

        gtk_image_set_from_file(GTK_IMAGE(image),fileName[1]);



        gtk_fixed_move(GTK_FIXED(fixed),image,i,j);

        break;

    case RIGHT:

        i = i+5;

        if(i>300){

            i = 300;

        }

        gtk_image_set_from_file(GTK_IMAGE(image),fileName[2]);

        gtk_fixed_move(GTK_FIXED(fixed),image,i,j);

        break;

    case DOWN:

        j = j+5;

        if(j>200){

            j = 200;

        }

        gtk_image_set_from_file(GTK_IMAGE(image),fileName[3]);

        gtk_fixed_move(GTK_FIXED(fixed),image,i,j);

        break;

    }

}

//按键判断

void my_key_press(GtkWidget* widget,GdkEventKey *event,gpointer data){

        switch(event->keyval){

        case GDK_KEY_a:

            forward = LEFT;

            move(forward);

            break;

        case GDK_KEY_w:

            forward = UP;

            move(forward);

            break;

        case GDK_KEY_d:

            forward = RIGHT;

            move(forward);

            break;

        case GDK_KEY_s:

            forward = DOWN;

            move(forward);

            break;

            

        }

}

int main(int argc,char* argv[]){





    GtkWidget *window;

    gtk_init(&argc,&argv);

 

    window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

    gtk_window_set_title(GTK_WINDOW(window),"Demo");

    gtk_window_set_default_size(GTK_WINDOW(window),300,200);



    g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);

    //关联按键回调函数

    g_signal_connect(G_OBJECT(window),"key-press-event",G_CALLBACK(my_key_press),NULL);



    fixed = gtk_fixed_new();

    gtk_fixed_set_has_window(GTK_FIXED(fixed),TRUE);

    gtk_widget_set_size_request(fixed,300,200);

    gtk_container_add(GTK_CONTAINER(window),fixed);

    image = gtk_image_new_from_file(fileName[0]);

    gtk_fixed_put(GTK_FIXED(fixed),image,i,j);

    gtk_widget_show_all(window);

    gtk_main();

 

    return 0;

}


效果