搭建环境
- 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;argc, &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下面那个按键(与~一起的).
运行结果如下:
一点疑问
上面的代码编译后得到的程序是无法通过按键关闭的,唯一的方法是在终端里产生一个中断,比如说ctrl+c. 假如希望当按下button时程序自动退出,可以将第52行代码反注释.此时,按下button后,程序向终端打印一条语句"the button was clicked -- hello! i =***",然后程序终止.这就带来了一个问题,假如将第52行代码放在第50行代码之前,那么得到的结果是程序直接退出,不再向输出任何信息了.这是不是可以说明,GTK+ 中widget同时绑定多个回调函数后,对回调函数的响应是按照源码中的顺序依次执行的?
PS: 偷懒用gedit写的代码,居然将缩进间隔调的这么小,悲剧了..送上gedit常用插件,智能拼写,自动tab什么功能都带上了.预览图如下,插件在这. 解压缩后复制到/usr/lib/gedit-2/plugins即可.
只会用C#拖控件的路过。。
39.gtk_init(&amp;amp;amp;amp;amp;argc, &amp;amp;amp;amp;amp;argv);
有错,请改正,& 不是 &。