gtk events

1. 按钮点击事件
代码如下:
#include <gtk/gtk.h>

void button_clicked(GtkWidget *widget, gpointer data)
{
	g_print("clicked\n");
}

int main(int argc, char *argv[])
{
	GtkWidget *window;
	GtkWidget *halign;
	GtkWidget *btn;

	gtk_init(&argc, &argv);

	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title(GTK_WINDOW(window), "GtkButton");
	gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
	gtk_container_set_border_width(GTK_CONTAINER(window), 15);
	gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

	halign = gtk_alignment_new(0, 0, 0, 0);
	btn = gtk_button_new_with_label("Click");
	gtk_widget_set_size_request(btn, 70, 30);

	gtk_container_add(GTK_CONTAINER(halign), btn);
	gtk_container_add(GTK_CONTAINER(window), halign);

	g_signal_connect(G_OBJECT(btn), "clicked",
		G_CALLBACK(button_clicked), NULL);

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

	gtk_widget_show_all(window);

	gtk_main();

	return 0;
}

首先定义一个回调函数button_clicked(),然后使用g_signal_connect()函数去绑定回调函数和消息事件,这里绑定的对象是一个button,然后事件类型是click。

2. 窗口移动事件
代码如下:

#include <gtk/gtk.h>

void configure_callback(GtkWindow *window,
		GdkEvent *event, gpointer data)
{
	int x, y;
	GString *buf;

	x = event->configure.x;
	y = event->configure.y;

	buf = g_string_new(NULL);
	g_string_printf(buf, "%d, %d", x, y);

	gtk_window_set_title(window, buf->str);

	g_string_free(buf, TRUE);
}

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

	gtk_init(&argc, &argv);

	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
	gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
	gtk_widget_add_events(GTK_WIDGET(window), GDK_CONFIGURE);

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

	g_signal_connect(G_OBJECT(window), "configure-event",
		G_CALLBACK(configure_callback), NULL);

	gtk_widget_show(window);
	gtk_main();

	return 0;
}

3. enter signal
代码如下:
#include <gtk/gtk.h>

void enter_button(GtkWidget *widget, gpointer data)
{
	GdkColor col = {0, 27000, 30000, 35000};   

	gtk_widget_modify_bg(widget, GTK_STATE_PRELIGHT, &col);
}

int main(int argc, char *argv[])
{
	GtkWidget *window;
	GtkWidget *halign;
	GtkWidget *btn;

	gtk_init(&argc, &argv);

	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
	gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
	gtk_container_set_border_width(GTK_CONTAINER(window), 15);
	gtk_window_set_title(GTK_WINDOW(window), "Enter signal");

	halign = gtk_alignment_new(0, 0, 0, 0);

	btn = gtk_button_new_with_label("Button");
	gtk_widget_set_size_request(btn, 70, 30);

	gtk_container_add(GTK_CONTAINER(halign), btn);
	gtk_container_add(GTK_CONTAINER(window), halign);

	g_signal_connect(G_OBJECT(btn), "enter", 
		G_CALLBACK(enter_button), NULL);
	
	g_signal_connect(G_OBJECT(window), "destroy",
		G_CALLBACK(gtk_main_quit), NULL);
	
	gtk_widget_show_all(window);

	gtk_main();

	return 0;
}
也就是当鼠标进入到某个区域时调用相应的回调函数。

4. disconnecting a callback
代码如下:
#include <gtk/gtk.h>

gint handler_id;

void button_clicked(GtkWidget *widget, gpointer data)
{     
	g_print("clicked\n");
}

void toogle_signal(GtkWidget *widget, gpointer window)
{    
	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) {
   		handler_id = g_signal_connect(G_OBJECT(window), "clicked", 
			G_CALLBACK(button_clicked), NULL);
	} else {
   		g_signal_handler_disconnect(window, handler_id);
	}
}

int main(int argc, char *argv[])
{
	GtkWidget *window;
	GtkWidget *hbox;
	GtkWidget *vbox;
	GtkWidget *btn;
	GtkWidget *cb;

	gtk_init(&argc, &argv);

	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
	gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
	gtk_container_set_border_width(GTK_CONTAINER(window), 15);
	gtk_window_set_title(GTK_WINDOW(window), "Disconnect");

	hbox = gtk_hbox_new(FALSE, 15);

	btn = gtk_button_new_with_label("Click");
	gtk_widget_set_size_request(btn, 70, 30);
	gtk_box_pack_start(GTK_BOX(hbox), btn, FALSE, FALSE, 0);

	cb = gtk_check_button_new_with_label("Connect");
	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb), TRUE);
	gtk_box_pack_start(GTK_BOX(hbox), cb, FALSE, FALSE, 0);

	vbox = gtk_vbox_new(FALSE, 5);
	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
	gtk_container_add(GTK_CONTAINER(window), vbox);  

	handler_id = g_signal_connect(G_OBJECT(btn), "clicked", 
		G_CALLBACK(button_clicked), NULL);
	
	g_signal_connect(G_OBJECT(cb), "clicked",
		G_CALLBACK(toogle_signal), (gpointer) btn);
	
	g_signal_connect(G_OBJECT(window), "destroy",
		G_CALLBACK(gtk_main_quit), NULL);
	
	gtk_widget_show_all(window);

	gtk_main();

	return 0;
}
也就是说消息回调可以调用g_signal_handler_disconnect()函数来断开。

5. timer
代码如下:
#include <cairo.h>
#include <gtk/gtk.h>

gchar buf[256];

gboolean on_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data)
{        
	cairo_t *cr;

	cr = gdk_cairo_create(widget->window);

	cairo_move_to(cr, 30, 30);
	cairo_set_font_size(cr, 15);
	cairo_show_text(cr, buf);

	cairo_destroy(cr);

	return FALSE;
}

gboolean time_handler(GtkWidget *widget)
{    
	if (widget->window == NULL) return FALSE;

	GDateTime *now = g_date_time_new_now_local(); 
	gchar *my_time = g_date_time_format(now, "%H:%M:%S");

	g_sprintf(buf, "%s", my_time);

	g_free(my_time);
	g_date_time_unref(now);

	gtk_widget_queue_draw(widget);

	return TRUE;
}

int main(int argc, char *argv[])
{
	GtkWidget *window;
	GtkWidget *darea;

	gtk_init(&argc, &argv);

	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

	darea = gtk_drawing_area_new();
	gtk_container_add(GTK_CONTAINER(window), darea);

	g_signal_connect(darea, "expose-event",
		G_CALLBACK(on_expose_event), NULL);
	g_signal_connect(window, "destroy",
		G_CALLBACK(gtk_main_quit), NULL);

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

	gtk_window_set_title(GTK_WINDOW(window), "Timer");
	g_timeout_add(1000, (GSourceFunc) time_handler, (gpointer) window);
	gtk_widget_show_all(window);
	time_handler(window);

	gtk_main();

	return 0;
}
使用g_timeout_add()函数注册一个timer,当定时时间到了之后自然调用time_handler回调函数,这里是一秒调用一次。


参考: http://zetcode.com/gui/gtk2/gtkevents/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值