GTK+2.0之初始学习篇(二)—— g_signal_connect宏解释及HelloWorld

       GTK+2.0中利用信号/回调函数机制来处理窗口外部传来的事件、消息或信号。

       以下实现的是单击窗口关闭按钮,窗口自动关闭。在程序中调用了gtk_main_quit()函数实现退出主循环。

#include<gtk/gtk.h>
void on_delete_event(); //函数声明
int main(int argc, char* argv[])
{
    GtkWidget *window;
    gtk_init(&argc, &argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    /*
     *这里要注意的是g_signal_connect宏.
    */
    g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(on_delete_event), NULL);
    gtk_window_set_title(GTK_WINDOW(window), "第二个练习窗口例子");
    gtk_window_set_default_size(GTK_WINDOW(window),500, 100);
    /*
     *设定窗口的位置在父窗口的中部
    */
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
    gtk_widget_show(window);
    gtk_main();
    return FALSE;
}
/*
 *实现退出主循环
*/
void on_delete_event(GtkWidget *widget, GdkEvent* event, gpointer data)
{
     gtk_main_quit(); 
}

      g_signal_connect宏是今天学习的目的之一。g_signal_connect宏有4个参数

gulong g_signal_connect( gpointer *object,
                         const gchar *name,
                         GCallback func,
                         gpointer func_data );

      它们分别是连接信号控件的指针(连接的对象)、信号名称、回调函数以及传递给回调函数的参数。而第三个回调函数一般为以下的形式

void callback_func( GtkWidget *widget,  gpointer callback_data );

        第一个参数是指向发出信号的控件指针,第二个参数是g_signal_connect宏的最后一个参数传进来的数据指针。


      接下来我们来学习HelloWorld的代码。在上面的代码里添加HelloWorld。

#include<gtk/gtk.h>
//函数声明
void on_delete_event();
void on_button_clicked();
//定义单击次数统计
gint data_count = 1;

int main(int argc, char* argv[])
{
    GtkWidget *window;
    GtkWidget *button;
    
    gtk_init(&argc, &argv);
    
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(on_delete_event), NULL);
    
    gtk_window_set_title(GTK_WINDOW(window), "Hello World Test");
    gtk_window_set_default_size(GTK_WINDOW(window),500, 100);
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);

    gtk_container_set_border_width(GTK_CONTAINER(window),50);
    button = gtk_button_new_with_label("按下按钮将会显示一行信息:");
    //响应click事件
    g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(on_button_clicked),(gpointer)data_count);
    gtk_container_add(GTK_CONTAINER(window),button);

    gtk_widget_show(button);
    gtk_widget_show(window);
    gtk_main();
    return FALSE;
}

void on_delete_event(GtkWidget *widget, GdkEvent* event, gpointer data)
{
     gtk_main_quit(); 
}
/*
 *实现单击显示Hello World 结果以及显示单击的次数data_count
*/
void on_button_clicked(GtkWidget *button, gpointer userdata)
{
    g_print("Hello,The test for 'Hello World'!");
    g_print("%d\n", data_count);
    data_count = data_count + 1;
}

      执行  $gcc -o gtksec ./gtk_sec.c `pkg-config --cflags --libs gtk+-2.0`  

      将会看到程序结果。

转载于:https://my.oschina.net/HughLu/blog/191194

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值