gtk窗口默认接收按键事件,按键事件为"key-press-event",回调函数为
通过判断按键键值实现控制图片的上下左右移动,按键键值定义在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;
}
效果
