搭建环境

  • apt-get install build-essential # 安装基本的编译工具(gcc等)
  • apt-get install gnome-core-devel #安装 libgtk2.0-dev libglib2.0-dev 等开发相关的库文件
  • apt-get install pkg-config #用于在编译GTK程序时自动找出头文件及库文件位置
  • apt-get install devhelp #安装 devhelp GTK文档查看程序
  • apt-get install libglib2.0-doc libgtk2.0-doc #安装 gtk/glib 的API参考手册及其它帮助文档
  • apt-get instal glade libglade2-dev #安装基于GTK的界面构造程序
  • apt-get install gnome-devel gnome-dev-doc #开发gnome的IDE

..为了以后编程方便,建议顺手敲上这句, cp -R /usr/include/gtk-2.0/* /usr/include/c++/4.4/,注意下命令中有无*的区别,这样引入头文件就可以直接这么写了 #include<gtk/gtk.h> .

helloworld

源码如下(注意包含gtk.h):

/*
* File:   hello.cpp
* Author: arthur
*
* Created on 2010年4月9日, 上午11:51
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <gtk/gtk.h>

int i=0;

static void hello(GtkWidget * button, gpointer data)
{
g_print("the button was clicked -- hello! i = %d \n", i);
i++;
}

static gint delete_event(GtkWidget *window, GdkEventAny *event, gpointer data)
{
g_printf("deleve event occur.. i = %d \n", i);
i++;
//
return TRUE;
}

void destroy(GtkWidget * button, gpointer data)
{
gtk_main_quit();
}

gint main(gint argc, gchar *argv[])
{
GtkWidget *window;
GtkWidget *button;

gtk_init(&amp;amp;amp;amp;amp;argc, &amp;amp;amp;amp;amp;argv);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

gtk_signal_connect(GTK_OBJECT(window), "delete_event", G_CALLBACK(delete_event), NULL);
gtk_signal_connect(GTK_OBJECT(window), "destroy", G_CALLBACK(destroy), NULL);

gtk_container_set_border_width (GTK_CONTAINER (window), 50);

button = gtk_button_new_with_label("hello button");

gtk_signal_connect(GTK_OBJECT(button), "clicked", G_CALLBACK(hello), NULL);

// g_signal_connect_swapped (GTK_OBJECT (button), "clicked", G_CALLBACK (gtk_widget_destroy), window);

gtk_container_add(GTK_CONTAINER(window), button);

gtk_widget_show(button);
gtk_widget_show(window);

gtk_main();

return 0;

}

编译命令为: gcc -o helloworld helloworld.c `pkg-config --cflags --libs gtk+-2.0` ,其中 pkg-config --cflags gtk+-2.0 列出 include 目录,pkg-config --libs gtk+-2.0 列出编译连接库,当然可以将这两个选项合二为一,如前面编译命令所示.注意,这里,`并非单引号,而是ESC下面那个按键(与~一起的).

运行结果如下:

hello

gcc  -o helloworld helloworld.c `pkg-config --cflags --libs gtk+-2.0`

一点疑问

上面的代码编译后得到的程序是无法通过按键关闭的,唯一的方法是在终端里产生一个中断,比如说ctrl+c. 假如希望当按下button时程序自动退出,可以将第52行代码反注释.此时,按下button后,程序向终端打印一条语句"the button was clicked -- hello! i =***",然后程序终止.这就带来了一个问题,假如将第52行代码放在第50行代码之前,那么得到的结果是程序直接退出,不再向输出任何信息了.这是不是可以说明,GTK+ 中widget同时绑定多个回调函数后,对回调函数的响应是按照源码中的顺序依次执行的?

PS: 偷懒用gedit写的代码,居然将缩进间隔调的这么小,悲剧了..送上gedit常用插件,智能拼写,自动tab什么功能都带上了.预览图如下,插件在这. 解压缩后复制到/usr/lib/gedit-2/plugins即可.

Screenshot-gedit