#include <gtk-2.0/gtk/gtk.h>
/* 回调函数在本例中忽略了传递给程序的所有参数。下面是回调函数 */
void hello(GtkWidget *widget, gpointer data)
{
g_print("Hello World\n");
}
gint delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
{
/* 如果在"delete_event"处理程序中返回FALSE,
* GTK将引发一个"destory"信号,
* 返回TRUE意味着你不想关闭窗口。
* 这些在弹出"你真的要退出?"对话框时很有作用*/
g_print("delete event occurred\n");
/* 将TRUE改为FALSE,主窗口就会用一个"delete_event"信号,然后退出*/
return(TRUE);
}
/* 另一个回调函数 */
void destory(GtkWidget *widget, gpointer data)
{
gtk_main_quit();
}
int main(int argc, char *argv[])
{
/* GtkWidget是构件的存储类型 */
GtkWidget *window;
GtkWidget *button;
/* 在所有的Gtk应用程序中都应该调用。
* 它的作用是解析由命令行传递进来的参数并将它返回给应用程序*/
gtk_init(&argc, &argv);
/* 创建一个主窗口 */
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
/* 当给窗口一个"delete_event"信号时
* (这个信号是由窗口管理器发出的,
* 通常是在窗口标题条右边的"x"按钮,
* 或者在标题条的快捷菜单上选择"close"选项时发出的),
* 我们要求调用上面定义的delete_event()函数
* 传递给这个回调函数的数据是NULL,回调函数会忽略这个参数*/
gtk_signal_connect(GTK_OBJECT(window), "delete_event", GTK_SIGNAL_FUNC(delete_event), NULL);
/* 这里,我们给"destory"事件连接一个信号处理函数,
* 当我们在窗口上调用gtk_widget_destory()函数
* 或者在"delete_event"事件的回调函数中返回FALSE时会发生这个事件*/
gtk_signal_connect(GTK_OBJECT(window), "destory", GTK_SIGNAL_FUNC(destory), NULL);
/* 设置窗口的边框宽度 */
gtk_container_set_border_width(GTK_CONTAINER(window), 10);
/* 创建一个标题为"Hello World"的按钮 */
button = gtk_button_new_with_label("Hello World");
/* 当按钮接收到"clicked"时,它会调用hello()函数,
* 传递的参数为NULL。函数hello()是在上面定义的 */
gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(hello), NULL);
/* 当点击按钮时,通过调用gtk_widget_destroy(window)函数销毁窗口
* 另外,"destory"信号可以从这里发出,也可以来自于窗口管理器*/
gtk_signal_connect_object(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(window));
/* 将按钮组装到窗口中(一个gtk容器中) */
gtk_container_add(GTK_CONTAINER(window), button);
/* 最后一步就是显示新创建的构件 */
gtk_widget_show(button);
/* 显示窗口 */
gtk_widget_show(window);
/* 所有的GTK应用程序都应该有一个gtk_main()函数。
* 程序的控制权停在这里并等着事件的发生(比如一次按键或鼠标事件)*/
gtk_main();
return(0);
}
编译:
gcc -Wall -g helloworld.c -o helloworld `pkg-config --cflags --libs gtk+-2.0`
点击窗口的“X”按钮,因为回调函数delete_event中最后返回的是TRUE,因此将在后台看到输出"delete event occurred“,而窗口并不会关闭,将返回值改为FALSE,重新编译,点击“X”按钮,后台仍然输出"delete event occurred“但同时窗口关闭,而如果点击"Hello World"按钮,后台输出“Hello World”同时窗口关闭