|

楼主 |
发表于 2003-7-5 14:25:52
|
显示全部楼层
后端: 与GUI互动
库和API
当编写GTK+和GNOME程序时,需要注意几个不同的库和工具。以下是它们的列表,并带有简短的介绍。
Glib:
Glib提供了一些函数,用来替代基本的C函数特别是具有缓冲区溢出 危险的函数。如果你正在进行gnu,gtk+和gnome程序的编写,Glib很值得学习。基本API在这里。许多先进 的控件,比如列表和选项菜单用到了Glib中的链表,这也是需要熟悉它的另一个原因。
GDK:
GDK是一个基本的库,把GTK和窗口系统的细节隔离开。它面对窗口管 理器,比如metacity, sawfish或其它东西。它提供了很基本的画图工具及可能用在 callbacks.c里的函数,大多数函数用来隐藏和扩大窗口。API在这里。
Gtk+:
Gtk+是Gimp工具箱。版本1.* 与版本2.*不一致。Glade2使用2.*, Glade使用1.*。这个教程使用Gtk2。你可以在这里找到这些 API。Gtk+很重要,它提供了为Gtk+控件改变属性、捕获信号、获得并放置数据等等的所有 函数。每个控件及其相关函数在API有描述,这是用Glade编程的主要参考手册。
Libgnome和libgnomeui:
这些库包含了额外的gnome库。 如果你用glade开发gnome程序,需要安装它们。我们用在gtemp中的gnome控件也在这些库 里,APIs提供了使用这些控件的细节。查看libgnome文档 和libgnomeui文档。
Libglade:
glade用Libglade从*.glade文件中创建代码。 开发者可以用来做同样的事,载入一个*.glade xml文件来创建界面代码。参考手册在这里。
其它库:
还有一些可用的其它库,是gnome/gtk系统的一部分。 它们的API在gnome.org网站上的gnome开发者站点。
指向控件
连接后端和GUI仅仅是显示和接收来自控件的数据。上面提到的Gtk+和Gnome库文件为每一个控件提供函数,允许你设置和获取数据。不过有时在程序中你还是要指向控件。
最简单的方法是使用Glade在support.c里提供的lookup_widget()函数。这个函数以一个控件和控件名字做参数,返回所要的控件(如果它在参数控件的树里)。 例如,Gtemp界面里创建了一个控件叫做fahr_entry,它在主程序窗口树中。 如果我们正在处理fahr_entry的一个活动回调函数,不过想找到控件 cel_entry,把数据放进去,可以用 GtkWidget *cel_entry = lookup_widget(GTK_WIDGET(fahr_entry), "cel_entry")。这个看上去有点糊涂,不过基本上它是一个声明为GtkWidget类型 (cel_entry)的指针,与控件自己指的是同样一个东西。
另一个指向一个控件的方法是使用gtk_widget_get_toplevel()。参数是子控件。例如,找出cel_entry最上层的容器控件(通常是gtemp程序窗口)可以这样做 ... GtkWidget *gtemp_app = gtk_widget_get_toplevel(GTK_WIDGET(cel_entry));.
你也可以使用静态或全局变量来联系控件。经常这是从子窗口(如弹出窗口和对话框)指向主窗口是最简单的方法。不过,使用太多的全局变局会被认为是糟糕的编码,鼓励限制使用这它们。如果我们使用gtemp_app做为一个全局变量,并在main.c里实现它,那么在callbacks.c或其它需要用到的地方中把它声明为外部变量。从这个角度, Gtemp不需要做这些。
Glib提供了一种方法,可以将任何g_object和gtk+对象关联到一个关键字符串上。注意Gtk+小于2.0时,有一个gtk_object类,现在包含在g_object下。任何时候你可以使用指向设在一个对象上的数据。例如,这段代码设置一个指向cel_entry的标志并连接到fahr_entry。
static gchar *my_key_string = "my_key_string";
cel_entry = lookup_widget(GTK_WIDGET(fahr_entry), "cel_entry");
g_object_set_data(G_OBJECT(fahr_entry), my_key_string, cel_entry);
程序的后面我们可以直接从fahr_entry获得cel_entry :
GtkWidget *cel_entry;
cel_entry = g_object_get_data(G_OBJECT(fahr_entry), my_key_string);
当然, 当指向的控件在同一个控件树中(如它们在同一个窗口)这个方法不太有用处。 lookup_widget函数会更好些。不过,这个技术很适合从一个窗口指向另一个窗口,而且不会用到全局变量。这样你可以从一个弹出窗口获得数据并输入到主窗口,比如不需要使主窗口全局化。
调出新窗口或菜单
Glade在interface.c里写入每个设计出来的窗口或弹出菜单的创建函数。 通常使用这些函数没有必要编辑interface.c文件。这些函数叫做create_windowname(), 没有参数,返回一个指向实际窗口或弹出菜单控件的指针。例如,下面这段代码为 Gtemp创建"关于"窗口:
GtkWidget *about;
about = create_gtemp_about();
是,就是这么简单。
当窗口不再使用时销毁它
如果你已经创建了一个弹出窗口或对话框,再也不会用到它,你可以用gtk_widget_destroy() 销毁它。参数是想要销毁的GtkWidget。通常这个函数会被要销毁窗口的"ok"或"cancel"键调用。例如,从一个名叫'which_file'的弹出窗口上的"ok"按钮销毁这个窗口,只需要在这个按钮的回调函数中调用上面那个函数。:
gtk_widget_destroy(gtk_widget_get_toplevel(GTK_WIDGET(ok_button)));
注意我们没有把这个按钮自己传入这个函数,这只会销毁这个按钮。我们 把按钮的上层父控件(窗口)传入函数。
下一步?
现在你知道了库的参考手册在哪儿,如何指向程序中的控件,是时候转向编写代码了。程序的内容通常包含收到数据如何处理,或显示之前如何处理。Glade这方面不做任何事情, 程序开发变成了一个编码问题,而不是一个界面问题。想知道一个简单的界面如何连接到一个一个简单的后端,我们将转入到Gtemp程序。 |
|