📄 gtk_tut-10.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Draft//EN"><HTML><HEAD><meta http-equiv="pragma" content="no-cache"><TITLE>GTK导引: 其它物件</TITLE></HEAD><BODY><A HREF="gtk_tut-9.html" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/gtk_tut-9.html"><IMG SRC="prev.gif" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/prev.gif" ALT="Previous"></A><A HREF="gtk_tut-11.html" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/gtk_tut-11.html"><IMG SRC="next.gif" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/next.gif" ALT="Next"></A><A HREF="gtk_tut.html#toc10" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/gtk_tut.html#toc10"><IMG SRC="toc.gif" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/toc.gif" ALT="Contents"></A><HR><H2><A NAME="s10">10. 其它物件</A></H2><P><H2><A NAME="ss10.1">10.1 标签</A></H2><P>标签在GTK中用得很多, 而且很简单. 标签不送信号, 因为它们跟X window没有关系.如果您要接取信号, 或裁切, 可用EventBox物件.<P>产生新的标签可用:<P><BLOCKQUOTE><CODE><PRE>GtkWidget* gtk_label_new (char *str);</PRE></CODE></BLOCKQUOTE><P>唯一个参数是您想要显示的文字.<P>在产生标签後要改变其文字, 可用:<P><BLOCKQUOTE><CODE><PRE>void gtk_label_set (GtkLabel *label, char *str);</PRE></CODE></BLOCKQUOTE><P>第一个参数是刚才所产生的标签(使用GTK_LABEL巨集来分派),第二个是新的字串.<P>新字串的空间会自动被配置.<P>要取得目前的字串可用:<P><BLOCKQUOTE><CODE><PRE>void gtk_label_get (GtkLabel *label, char **str);</PRE></CODE></BLOCKQUOTE><P>第一个参数是标签, 第二个是返回字串的位置.<P><H2><A NAME="ss10.2">10.2 Progress Bars</A></H2><P>Progress bars是用来显示某个作业的操作状态.他们很容易使用, 您会看到以下的程式.我们先来产生一个Progress Bar.<P><BLOCKQUOTE><CODE><PRE>GtkWidget *gtk_progress_bar_new (void);</PRE></CODE></BLOCKQUOTE><P>这样就产生了, 够简单的了.<P><BLOCKQUOTE><CODE><PRE>void gtk_progress_bar_update (GtkProgressBar *pbar, gfloat percentage);</PRE></CODE></BLOCKQUOTE><P>第一个参数是您要操作的Progress Bar,第二个是完成度, 其值为0-1.<P>Progress Bars一般与timeouts及其它函数一起使用,(seesection on <A HREF="gtk_tut-15.html#sec_timeouts" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/gtk_tut-15.html#sec_timeouts">Timeouts, I/O and Idle Functions</A>) 这是因为多工的考量.gtk_progress_bar_update会处理这方面的事务.<P>这里是使用Progress Bar的范例, 并用timeouts来更新.同时也会展示如何重设Progress Bar.<P><BLOCKQUOTE><CODE><PRE>#include <gtk/gtk.h>static int ptimer = 0;int pstat = TRUE;/* This function increments and updates the progress bar, it also resets the progress bar if pstat is FALSE */gint progress (gpointer data){ gfloat pvalue; /* get the current value of the progress bar */ pvalue = GTK_PROGRESS_BAR (data)->percentage; if ((pvalue >= 1.0) || (pstat == FALSE)) { pvalue = 0.0; pstat = TRUE; } pvalue += 0.01; gtk_progress_bar_update (GTK_PROGRESS_BAR (data), pvalue); return TRUE;}/* This function signals a reset of the progress bar */void progress_r (void){ pstat = FALSE; }void destroy (GtkWidget *widget, gpointer *data){ gtk_main_quit ();}int main (int argc, char *argv[]){ GtkWidget *window; GtkWidget *button; GtkWidget *label; GtkWidget *table; GtkWidget *pbar; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (destroy), NULL); gtk_container_border_width (GTK_CONTAINER (window), 10); table = gtk_table_new(3,2,TRUE); gtk_container_add (GTK_CONTAINER (window), table); label = gtk_label_new ("Progress Bar Example"); gtk_table_attach_defaults(GTK_TABLE(table), label, 0,2,0,1); gtk_widget_show(label); /* Create a new progress bar, pack it into the table, and show it */ pbar = gtk_progress_bar_new (); gtk_table_attach_defaults(GTK_TABLE(table), pbar, 0,2,1,2); gtk_widget_show (pbar); /* Set the timeout to handle automatic updating of the progress bar */ ptimer = gtk_timeout_add (100, progress, pbar); /* This button signals the progress bar to be reset */ button = gtk_button_new_with_label ("Reset"); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (progress_r), NULL); gtk_table_attach_defaults(GTK_TABLE(table), button, 0,1,2,3); gtk_widget_show(button); button = gtk_button_new_with_label ("Cancel"); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (destroy), NULL); gtk_table_attach_defaults(GTK_TABLE(table), button, 1,2,2,3); gtk_widget_show (button); gtk_widget_show(table); gtk_widget_show(window); gtk_main (); return 0;}</PRE></CODE></BLOCKQUOTE><P>在这个小程式中有四个区域在一般的Progress Bar操作上, 我们会一个一个看到.<P><BLOCKQUOTE><CODE><PRE>pbar = gtk_progress_bar_new ();</PRE></CODE></BLOCKQUOTE><P>产生Progress Bar, pbar.<P><BLOCKQUOTE><CODE><PRE>ptimer = gtk_timeout_add (100, progress, pbar);</PRE></CODE></BLOCKQUOTE><P>使用timeouts来产生一个固定时间间隔,Progress Bar不见的一定要用timeouts. <P><BLOCKQUOTE><CODE><PRE>pvalue = GTK_PROGRESS_BAR (data)->percentage;</PRE></CODE></BLOCKQUOTE><P>这行指定目前的值.<P><BLOCKQUOTE><CODE><PRE>gtk_progress_bar_update (GTK_PROGRESS_BAR (data), pvalue);</PRE></CODE></BLOCKQUOTE><P>最後, 这行更新Progress Bar的值.<P>这就是Progress Bars, enjoy.<P><H2><A NAME="ss10.3">10.3 对话盒</A></H2><P><P>对话盒物件很简单, 是个预先做好的视窗.对话盒的结构如下:<P><BLOCKQUOTE><CODE><PRE>struct GtkDialog{ GtkWindow window; GtkWidget *vbox; GtkWidget *action_area;};</PRE></CODE></BLOCKQUOTE><P>您看到, 它就是产生一个新的视窗.然後包一个vbox到它上面,接著一个seperator, 然後是hbox给"action_area".<P>对话盒是用於通告讯息, 及类似用途.这很基本, 只有一个函数:<P><BLOCKQUOTE><CODE><PRE>GtkWidget* gtk_dialog_new (void);</PRE></CODE></BLOCKQUOTE><P>因此要产生新的对话盒,<P><BLOCKQUOTE><CODE><PRE>GtkWidget window;window = gtk_dialog_new ();</PRE></CODE></BLOCKQUOTE><P>这会产生对话盒, 然後您可以任意使用它.然後将按钮包装到action_area, 像这样:<P><BLOCKQUOTE><CODE><PRE>button = ...gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button, TRUE, TRUE, 0);gtk_widget_show (button);</PRE></CODE></BLOCKQUOTE><P>然後您也可以用封装新增一个vbox, 例如, 一个新标签, 试试看:<P><BLOCKQUOTE><CODE><PRE>label = gtk_label_new ("Dialogs are groovy");gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label, TRUE, TRUE, 0);gtk_widget_show (label);</PRE></CODE></BLOCKQUOTE><P>做为一个对话盒的范例, 你可以使用两个按钮在action_area,一个Cancel及Ok按钮, 及一个标签在vbox area,问使用者一个问题或提示错误的发生等等.然後您可以接到不同的信号上来处理使用者的选择.<P><P><H2><A NAME="ss10.4">10.4 Pixmaps</A></H2><P>Undocumented.<P><H2><A NAME="ss10.5">10.5 Images</A></H2><P>Undocumented.<P><P><P><HR><A HREF="gtk_tut-9.html" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/gtk_tut-9.html"><IMG SRC="prev.gif" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/prev.gif" ALT="Previous"></A><A HREF="gtk_tut-11.html" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/gtk_tut-11.html"><IMG SRC="next.gif" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/next.gif" ALT="Next"></A><A HREF="gtk_tut.html#toc10" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/gtk_tut.html#toc10"><IMG SRC="toc.gif" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/toc.gif" ALT="Contents"></A></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -