linux GUI庫GTK+的簡單應用之事件和事件監聽器

剛接觸GTK+,先來看看一個簡單的用戶登錄的小例子,再來說說

GTK+的信號和回調函數實現的事件監聽器。


#include<gtk/gtk.h>
#include<stdio.h>
#include<string.h>
const char *password = "correct";

void closeApp(GtkWidget *window, gpointer data)
{
	gtk_main_quit();
}

void button_clicked(GtkWidget*button, gpointer data)
{
	const char *password_input = gtk_entry_get_text(GTK_ENTRY((GtkWidget *)data));
	if(strcmp(password_input,password) == 0)
		printf("OK\n");
	else
		printf("wrong password\n");
}

int main(int argc, char *argv[])
{
	GtkWidget *window;
	GtkWidget *username_label, *password_label;
	GtkWidget *username_entry, *password_entry;
	GtkWidget *ok_button;
	GtkWidget *hbox1, *hbox2;
	GtkWidget *vbox;
	gtk_init(&argc,&argv);
	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title(GTK_WINDOW(window),"first gtk gui");
	gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
	gtk_window_set_default_size(GTK_WINDOW(window),200,200);
	g_signal_connect(GTK_OBJECT(window),"destroy",GTK_SIGNAL_FUNC(closeApp),NULL);
	username_label = gtk_label_new("Login: ");
	password_label = gtk_label_new("Password: ");
	username_entry = gtk_entry_new();
	password_entry = gtk_entry_new();
	gtk_entry_set_visibility(GTK_ENTRY(password_entry),FALSE);
	ok_button = gtk_button_new_with_label("OK");
	g_signal_connect(GTK_OBJECT(ok_button),"clicked",GTK_SIGNAL_FUNC(button_clicked),password_entry);
	hbox1 = gtk_hbox_new(TRUE, 5);
	hbox2 = gtk_hbox_new(TRUE, 5);
	vbox = gtk_vbox_new(FALSE, 10);
	gtk_box_pack_start(GTK_BOX(hbox1), username_label, TRUE, FALSE, 5);
	gtk_box_pack_start(GTK_BOX(hbox1), username_entry, TRUE, FALSE, 5);

	gtk_box_pack_start(GTK_BOX(hbox2), password_label, TRUE, FALSE, 5);
	gtk_box_pack_start(GTK_BOX(hbox2), password_entry, TRUE, FALSE, 5);

	gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE, 5);
	gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 5);
	gtk_box_pack_start(GTK_BOX(vbox), ok_button, FALSE, FALSE, 5);

	gtk_container_add(GTK_CONTAINER(window),vbox);
	gtk_widget_show_all(window);
	gtk_main();

	return 0;
	
}

gcc gtkLogin.c -o gtkLogin `pkg-config --cflags --libs gtk+-2.0`編譯此程序

./gtkLogin運行此程序,結果如下。


我覺得有意思的是,GTK+是用純C寫的一個庫,但可以通過宏支持繼承和多態,支持面向對象。

代碼中使用g_singal_connect(gpointer *object, const gchar *name, GCallback func, gpointer user_data)連接信號和回調函數,第一個參數信號發出的窗口部件,

第二個參數是以字符串指定的信號名,第三個參數就是處理信號的回調函數指針,第四個參數是傳遞用戶數據的指針。

回調函數原型:

void a_callback_function(GtkWidget *widget, gpointer user_data);

第一個參數正是發出信號的窗口部件指針,第二個參數是傳遞數據過來的任意類型指針。

GTK+就是使用信號和回調函數實現的事件監聽器系統,使用連接函數使得信號和信號處理器即回調函數對應起來了,這和MFC的窗口系統中的消息映射竟然

是那麼的似曾相識。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章