[I.P.LED][Innovation Practise Linux&Embedded Department][Getting Started G
本人吐血推荐,哈哈,主要是用了我一个上午+半个下午的时间才配置好的……真的吐血了Operation System:Debian
Kernel:lenny
Uname -a:Linux 2008 i686 GUN/Linux
GCC -V:gcc version 4.2.3 (Debian 4.2.3-5)
Steps:----->>>>>Xrz
First:安装几个必须的包 sudo apt-get install build-essential gnome-core-devel pkg-config devhelp libglib2.0 libgtk2.0-doc glade libglade2-dev (个人一件阿 aptitude install software比apt-get install 更能处理好所谓的依赖问题,至少告诉你少什么)
Second:开始安装gtk的几个比较难缠的包
第一个GLIB
第二个ATK
第三个CAIRO
第四个PANGO
第五个GTK
(安装指令统一为:./configure --prefix=/usr && make && make install)
直接在终端里面输入,不明白为什么的可以去看看&&的有关知识,打一次命令比三次方便吧
按照这个顺序安装一般不会出现依赖问题。
安装GTK的时候参数参考http://www.gtk.org (./configure --prefix=/opt/gtk)
一般官方网站上都是会有写如何安装的,英文不好的仔细看看也知道了
http://www.gtk.org上面只有三个软件是gtk glib pango 其余的需要另外安装
安装完GTK之后记得将gtk+-2.0.pc 复制到/usr/lib/pkgconfig下
(其实我发现我复制了3个文件,编译的时候提示少什么就复制什么进去就是了)
CAIRO的安装
这个东西麻烦了我好久用 aptitude search cairo 可以找到很多包……名字后面有解释的
我记得是装了一个 libcairo2-dev 的东西才搞定的……还有就是安装之前最好apt-get update一下
PANGO 的安装路径:
默认安装在/usr/local下对pango来说不行,
这样比较全面./configure --prefix=/usr --libdir=/usr/lib --sysconfdir=/etc
不过我就没有怎么改动。
Third:参考的资料主要来自http://hi.baidu.com/yibobin/blog/item/3365146277dd87d8e6113af2.html
不过他也是转的,源头就不知道在哪里了。一些知识这个帖子可以找到的。
等把最后一个 gtk 也装好了之后,确定自己装好了gtk的环境的方法就是编译一个文件来看看是不是运行成功了。
Forth:建立一个hellogtk.c的文件然后把代码可以复制进去,我用的是vim
#include<gtk/gtk.h>
void hello(GtkWidget *widget,gpointer data)
{
g_print("Hello Debian!\n");
}
gint delete_event(GtkWidget *widget,GdkEvent *event,gpointer data)
{
g_print ("delete event occurred\n");
return(TRUE);
}
void destroy(GtkWidget *widget,gpointer data)
{
gtk_main_quit();
}
int main( int argc, char *argv[] )
{
GtkWidget *window;
GtkWidget *button;
gtk_init (&argc, &argv);
window=gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_signal_connect (GTK_OBJECT(window),"delete_event",GTK_SIGNAL_FUNC(delete_event),NULL);
gtk_signal_connect (GTK_OBJECT (window), "destroy",GTK_SIGNAL_FUNC (destroy), NULL);
gtk_container_set_border_width (GTK_CONTAINER (window), 10);
button = gtk_button_new_with_label ("Hello Ubuntu!");
gtk_signal_connect (GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC (hello), NULL);
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC (gtk_widget_destroy),GTK_OBJECT (window));
gtk_container_add (GTK_CONTAINER (window), button);
gtk_widget_show (button);
gtk_widget_show (window); /*显示一个窗口*/
gtk_main(); /*进入主循环*/
return(0);
}
代码的意思先不用管,以后会看懂的。
然后执行
$ gcc gtkhello.c -o gtktest `pkg-config --cflags --libs gtk+-2.0`
$ ./gtktest
会显示一个带有一个按钮的窗口,点击按钮以後窗口关闭。如果成功了,呵呵,太好了,祝贺你,如果没有成功,希望在求助的时候给出error信息。
在这里面要注意:编译第一个例子时
gcc base.c -o base `pkg-config --cflags --libs gtk+-2.0`
注意上面编译命令中使用的单引号类型是很重要的。(译者注:这里使用了“命令替换”。命令替换(command substitution)使得可以捕获一个命令的输出而在另一个命令中替换它。这个单引号不是回车键左边的那个,而是ESC键下面的那个。)
Fifth:呵呵,差不多了,如果你的第一个程序都能运行了,那么是在是太好了,我们就可以开始下面的事情咯。
不知道我推荐给大家的那本书大家看的怎么样了,我看完了前3章了,感觉很好阿,一开始的时候看得慢,没有关系的,看不懂也要硬着头皮往下看,慢慢的,你就会看的很快了,跟看中文的差不多,就当学习专业英语了,哈哈哈哈。
Sixth:其实不一定分六步的,不过我粘贴复制了这么多行了,自然要写完是不是,呵呵。
很多东西都是靠大家baidu,google出来的,其实很多书中或者官方网站的文档里面写的很清楚了,大家因为不爱去看怕麻烦,所以反而走了一条比较远的路,所谓磨刀不误砍柴功嘛,有机会,有时间,看看文档还是不错的哦。反正我现在在家里也上不了学校去了……有时间编辑帖子了,哈哈,前几天还被傻孩子催呢,没更新帖子的原因主要是考虑到东西我放上来的文档里面都写的那么清楚,我无非就是再翻译便,翻译的又不好,多没意思的,大家看看不就好了?嘿嘿
下次再发贴子的时候,估计就可以照着例程写点有点用的小小的GTK程序了,多有成就感的。
Write by XBL 太巧了,我昨天刚刚做成这一步!接下来下在学习中! 呵呵,不错不错。继续努力,我准备直接开始看Dynamic User Interfaces了,感觉前面的基本都是字典…… www.gtk.org----我推荐的学习gtk的官方网站,上面资料多多
网页上找到Documentation 然后在里面的API下面可以找到很详细的资料手册
在网上和一个高手交流,这个gtk阿主要是一些控件,对于开发一些vb类似的程序貌似是很好用的哦。
但是如果像要用来做一些自己的画图的话,就要看GDK了,这里面提供了很详细的很基础的一些函数阿什么。
现在我正在看,……东西很多,都贴上来也不现实,慢慢看咯。
以后学好了,贴点程序上来。 http://blog.csdn.net/cxjddd/archive/2005/04/12/344844.aspx
本来想直接贴,结果换行有问题,所以给出链接了,这几天学车,累……也耗时间,有空还要分段写点注释。
这个也是转过来的,大家要弄清楚这个程序的特点和编写的程序,我觉得这篇文章写得不错。
http://www.chineselinuxuniversity.net/articles/6336.shtml
GTK(GIMP Toolkit)是一个图形用户编程的接口。它完全免费,所以用来开发自由软件或商业软件都不需要花费什么。现在很多Linux集成系统都已经将GTK1.2版本打包进去了。包括RedHat Linux 6.0以上版本,还有中文化的Turbo Linux等等。它也越来越被普遍的应用于UNIX系统编程。
还有一个组件叫Glib,它包含了一些标准应用的新扩展用来提高GTK的兼容性。用于Linux系统的某些函数可能不适合标准的UNIX系统,例如g_strerror()函数等等。某些函数也扩展了GNUC的一般功能,例如g_malloc函数就有自己加强的调试功能。
GTK可以与多种语言绑定,包括C++, Guile, Perl, Python, Ton, Ada95, Objective C, Free Pascal, Eiffel。用标准C开发的程序,编译软件可用GNU并附带上GTK选项即可。想用除了标准C以外的其它语言来开发Xwindow图形用户程序,则需要先参考一下有关绑定软件的内容(HTTP:// www.gtk.org)。 如果用C++语言来调用GTK进行开发,可以用已经和C++绑定的软件叫GTK--软件,来提供一个比GTK更好的C++编译环境。
目前已经开发出来GTK的增强版GTK+。GTK+是将GTK,GDK,GLIB集成在一起的开发包,可以工作在许多类似于UNIX的系统上,没有GTK的平台限制。
GTK的消息处理机制
下面先看一个基本的例子,该例子产生一个200×200像素的窗口。它不能自己退出,只能通过shell来杀死进程(调用kill命令)。
/*例子 base.c */
#include
int main( int argc,char *argv[ ] ){
GtkWidget *window;
gtk_init (&argc, &argv); /* 初始化显示环境 */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /* 创建一个新的窗口*/
gtk_widget_show (window); /*显示窗口*/
gtk_main (); /*进入睡眠状态,等待事件激活*/
return(0);
}
从上面的程序可以看出,GTK是一个事件驱动工具包,当它运行到gtk_main()函数时会自动睡眠,直到有事件发生,控制权转让给相应的函数调用,在该函数中可以用标准C写出相应的事物逻辑。这与windows 上的程序处理是一样的。
对窗口对象上发生的事件(如按下鼠标,激活键盘等),GTK也有相应的消息信号产生。这时就需要程序员创建一个信号处理器来捕获该信号,并告诉GTK程序事件发生后调用哪个回调函数。信号处理器的创建函数定义如下:
gint gtk_signal_connect( GtkObject *object, gchar *name,GtkSignalFunc callback_func, gpointer func_data );
返回值是一个区分同一对象中的事件与不同回调函数的关联标签。这样可以做到一个对象的一个信号就有任意多个回调函数,并且每一个都会按照声明的顺序执行。函数调用的第一个参数是产生信号的widget组件(即按钮等窗口构件),而name则是希望捕获的信号或事件的名称,callback_func则是事件发生后所调用的回调函数名称,而第四个参数func_data则是传递给回调函数的参数。
回调函数要定义在主程序的前面,它们的一般格式都如下所示:
void callback_func( GtkWidget *widget, gpointer func_data );
调用下面这个方法将允许你将回调函数与事件的关联断开:
void gtk_signal_disconnect( GtkObject *object, gint id );
该函数的第二个参数就是上述gtk_signal_connect()函数的返回值,即关联标签。第一个参数指向了去除关联的对象名称。这样可以做到断开事件与回调函数的关联,使得事件发生后,不会调用相关的回调函数。
布局格式
打包盒子
对GTK显示格式的控制是通常通过打包盒子来完成的。widget组件打包可以采用两种方式,水平盒子和垂直盒子。若将widget组件打包进平行盒子,组件就被依次水平的插入窗口;若是垂直盒子,则组件排列是垂直的。产生新的水平盒子的函数为
GtkWidget *gtk_hbox_new (gint homogeneous, gint spacing);
参数homogeneous是用来控制是否盒子中的每个组件都有同样的大小(例如水平盒子中的控件有同样的宽度,垂直盒子中的控件有同样的高度)。Spacing参数是组件之间的间隔。
垂直盒子的创建函数是gtk_vbox_new(),定义与水平盒子一致。
gtk_box_pack_start()和gtk_box_pack_end()函数是用来将打包对象放入这些盒子中的。
void gtk_box_pack_start( GtkBox *box, GtkWidget *child,gint expand, gint fill, gint padding );
第一个参数是你将组件打进去的盒子指针,第二个参数是你将要打进去的组件指针。Expand参数是用来控制是否允许组件扩展至分配给盒子空间的大小(选TRUE),还是盒子的大小收缩到组件那么大(选FALSE)。函数中的fill参数是用来控制是否将多余的空间分配给组件,即将组件扩展到盒子的大小(选TRUE),或者多余的空间不变,保留作为盒子和打包组件间的间隔。该参数只有在expand参数取TRUE时才有效。Padding参数是指组件四周与盒子的间隔大小。
注意fill取FALSE值,expand取TRUE值时与expand取FALSE值,fill值无效的区别。前者的盒子仍是原来创建盒子时指定的大小,而后者的盒子已经缩小到打包组件的大小了。
gtk_box_pack_end()函数的参数与上面描述的一致。只是排列顺序分别是从下到上
,从右到左。
最后将所有的盒子或组件打包到一个大盒子中,用gtk_container_add()函数将盒子加入窗口即可。
表格打包
我们可以产生一个表格,将widget组件一一放入。Widget组件将占据所有分配给它的空间。创建表格是用下面的函数:
GtkWidget *gtk_table_new( gint rows, gint columns,gint homogeneous );
第一个参数,显而易见,是表格的行数。后面的参数则是表格的列数。homogeneous参数则是用来安排表格间隔大小。如果它取TRUE,则表格中每个小格的大小用表格中最大组件的大小来设置的,所有的小格大小都是一样的。如果homogeneous参数取FALSE的,每个小格的大小都用同行中最高组件的高度,同列中最宽组件的宽度。
将一个widget组件放入一个表格,用下面的函数:
void gtk_table_attach( GtkTable *table, GtkWidget *child, gint left_attach,
gint right_attach, gint top_attach, gint bottom_attach,
gint xoptions, gint yoptions, gint xpadding, gint ypadding );
left_attach参数和right_attach参数将指出在哪儿放置组件,以及用了多少盒子。如果你想在两行两列的表格中的右下小格中加入一个按钮,并且想让按钮充满那个小格,则参数可以选择left_attach = 1, right_attach = 2, top_attach = 1, bottom_attach = 2。其实left_attach也就是组件所在小格的左边框是表格的第几条边数,其它依此类推。
参数xoptions和yoptions是用来确定打包选项的,可以用OR来选择多个选项。
调节器
GTK有很多组件可以用鼠标或键盘来调整,例如范围组件(Range Widget)。还有一些组件在整个数据区域的一部分是可调整的,例如文本组件(Text Widget)和视口组件(Viewport Widget)。
很明显,程序是要能够对可调整组件所产生的变化进行处理。一种解决办法是让可调整组件在释放自己的信号时,将调整数据值传递信号处理器。或者用另外一种解决方法将调整数据值放入一个数据结构,由程序访问该结构来获得改变的参数值。有时候你可能需要将几个可调整组件的调节相关联,调整一个也会导致另一个的变化。最明显的例子就是滚动条与文本编辑框组件的处理。如果这些相关联的组件分别有自己处理调整数据的方法,则程序员必须自己写一个信号处理器,将一个组件的调整数据转换成另一个组件的调整数据,并调用调整设置函数将该值设置进去。
GTK调用了调节器成功的解决了这个问题。调节器不是组件,而是存储和传递调整数据的结构。最典型的调整器应用是存储配置参数和范围组件的值。不同的是调整器也是从对象(Object)继承而来的,它有许多不同于数据结构的特性。最重要的是,它也会释放信号,并且这些信号不仅可以被程序捕获来响应用户的调整和编辑,还可以在可调整组件中透明的传播调整数据。
一般调节器会创建组件时自动创建。例如让文本组件和滚动条组件用同一个调节器如下所示:
text = gtk_text_new (NULL, NULL);
/* 将刚创建的调节器用于垂直滚动条 */
vscrollbar = gtk_vscrollbar_new (GTK_TEXT(text)->vadj);
调节器是从对象Object继承下来的。所以它与其它的组件对象一样,能够产生信号。当好几个组件共享一个调节器时,它们都会和一个信号处理器相关联。这个信号处理器是用来处理“value_changed”信号的,跟程序中处理信号是一样。下面是在GtkAdjustmentClass结构中该信号的定义:
void (* value_changed) (GtkAdjustment *adjustment);
不同的可调整组件都用一个调节器时,任何一个组件发生调整变化都会产生该信号。有两种情况会导致这个现象的发生。第一种情况是用户在用鼠标或键盘调整该组件(例如拉滚动条),或者直接在程序中用gtk_adjustment_set_value()函数来改变调节器中的value值。
当调节器的upper参数和lower参数被重新配置时,就象用户需要给一个文本编辑框加入了更多的文本后,调节器就会释放出“changed”信号。它的定义如下:
void (* changed) (GtkAdjustment *adjustment);
范围组件将该信号与一个信号处理器相关联,并随时在面板上反映参数的变化。举个例子,滚动条中滑动键的大小与调节器中upper,lower值之差正好成反比。一旦前者有任何改变,面板上的显示也会相应产生变化。
不需要在程序中将一个信号处理器与该信号相关联,一切都是GTK完成的。如果你直接设置了调节器的这些参数,则需要在程序中调用下面的语句来释放信号:
gtk_signal_emit_by_name (GTK_OBJECT (adjustment), "changed");
创建组件小结
从上面可看出,创建一个widget组件可以用以下几个步骤完成:
gtk_*_new()—调用一个非常有用的函数来产生一个新的widget组件。
4.2用gtk_box_pack_start()函数连接所有的信号和事件,产生相应的事件处理器来调用回调函数。
4.3设置widget组件以及调节器的特性。
4.4用合适的函数将widget组件打包到一个容器(盒子或表格)中,例如gtk_box_container_start()函数或者gtk_container_add()函数等。
4.5用gtk_widget_show()函数来显示组件。
用上述方法可创建出程序员所需要的任意窗口构件,再将容器打入窗口并显示窗口之后,程序便进入主循环睡眠状态,主程序编制也就结束了。事件的处理逻辑放到回调函数中编制。 留名,有时间细读。 mark
页:
[1]