📄 gtk_tut-6.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-5.html" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/gtk_tut-5.html"><IMG SRC="prev.gif" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/prev.gif" ALT="Previous"></A><A HREF="gtk_tut-7.html" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/gtk_tut-7.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#toc6" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/gtk_tut.html#toc6"><IMG SRC="toc.gif" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/toc.gif" ALT="Contents"></A><HR><H2><A NAME="s6">6. 按钮物件</A></H2><P><H2><A NAME="ss6.1">6.1 一般按钮</A></H2><P>我们到现在为止一直都看到按钮物件. 实在很简单.有两种方法来产生按钮, 您可以用gtk_button_new_with_label()来产生一个有标签的按钮, 或用gtk_button_new()来产生一个空按钮.现在您可以任意操作它, 接张图(pixmap)或标签上去, 随你.要达到这样的效果, 先产生一个box, 然後用gtk_box_pack_start将您的objects封装进这个box.然後用gtk_container_add来封装这个box到按钮中.<P>这里是个使用gtk_button_new来产生一张有图片及标签的按钮.我将程式分细使您在往後可以利用这个程式.<P><P><BLOCKQUOTE><CODE><PRE>#include <gtk/gtk.h>/* create a new hbox with an image and a label packed into it * and return the box.. */GtkWidget *xpm_label_box (GtkWidget *parent, gchar *xpm_filename, gchar *label_text){ GtkWidget *box1; GtkWidget *label; GtkWidget *pixmapwid; GdkPixmap *pixmap; GdkBitmap *mask; GtkStyle *style; /* create box for xpm and label */ box1 = gtk_hbox_new (FALSE, 0); gtk_container_border_width (GTK_CONTAINER (box1), 2); /* get style of button.. I assume it's to get the background color. * if someone knows the real reason, please enlighten me. */ style = gtk_widget_get_style(parent); /* now on to the xpm stuff.. load xpm */ pixmap = gdk_pixmap_create_from_xpm (parent->window, &mask, &style->bg[GTK_STATE_NORMAL], xpm_filename); pixmapwid = gtk_pixmap_new (pixmap, mask); /* create label for button */ label = gtk_label_new (label_text); /* pack the pixmap and label into the box */ gtk_box_pack_start (GTK_BOX (box1), pixmapwid, FALSE, FALSE, 3); gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 3); gtk_widget_show(pixmapwid); gtk_widget_show(label); return (box1);}/* our usual callback function */void callback (GtkWidget *widget, gpointer *data){ g_print ("Hello again - %s was pressed\n", (char *) data);}int main (int argc, char *argv[]){ /* GtkWidget is the storage type for widgets */ GtkWidget *window; GtkWidget *button; GtkWidget *box1; gtk_init (&argc, &argv); /* create a new window */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "Pixmap'd Buttons!"); /* It's a good idea to do this for all windows. */ gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_exit), NULL); /* sets the border width of the window. */ gtk_container_border_width (GTK_CONTAINER (window), 10); /* create a new button */ button = gtk_button_new (); /* You should be getting used to seeing most of these functions by now */ gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (callback), (gpointer) "cool button"); /* this calls our box creating function */ box1 = xpm_label_box(window, "info.xpm", "cool button"); /* pack and show all our widgets */ gtk_widget_show(box1); gtk_container_add (GTK_CONTAINER (button), box1); gtk_widget_show(button); gtk_container_add (GTK_CONTAINER (window), button); gtk_widget_show (window); /* rest in gtk_main and wait for the fun to begin! */ gtk_main (); return 0;}</PRE></CODE></BLOCKQUOTE><P>xpm_label_box函数可用来包装xpm及labels到物件中使其成为container.<P><H2><A NAME="ss6.2">6.2 双态按钮</A></H2><P>双态按钮跟一般按钮很像, 除了它们有两种状态, 由"click"来切换.他们可以是"被按下的", 当您再按一次, 它们会还原. 再按一次会再被按下去.<P>双态按钮是check按钮及radio按钮的基础. 它们有许多函数是继承双态按钮而来.我等一下会把它们指出来.<P>产生一个双态按钮:<P><BLOCKQUOTE><CODE><PRE>GtkWidget* gtk_toggle_button_new (void);GtkWidget* gtk_toggle_button_new_with_label (gchar *label);</PRE></CODE></BLOCKQUOTE><P>您可以看到, 这些跟一般按钮函数的用法一模一样.第一个产生一个空白的双态按钮,第二个则有个标签包在一起.<P>要取得双态按钮的状态, 包含了check及radio按钮也一样,我们用以下范例中所使用的巨集.这会测试该按钮的状态.当我们按下按钮时, 双态按钮的信号("toggled")会送给我们.要取得其状态, 设定好信号处理器来接取"toggled"信号,并使用该巨集来决定其状态.该callback函数看起来像这样:<P><BLOCKQUOTE><CODE><PRE>void toggle_button_callback (GtkWidget *widget, gpointer data){ if (GTK_TOGGLE_BUTTON (widget)->active) { /* If control reaches here, the toggle button is depressed. */ }}</PRE></CODE></BLOCKQUOTE><P><P><BLOCKQUOTE><CODE><PRE>void gtk_toggle_button_set_state (GtkToggleButton *toggle_button, gint state);</PRE></CODE></BLOCKQUOTE><P>以上的函数呼叫可用来设定双态按钮的状态(包含check及radio)传您所产生的按钮做为第一个参数, 然後TRUE或FALSE做为第二个用来指定它是up(release)或down(depressed).内定值是up, 或FALSE.<P><BLOCKQUOTE><CODE><PRE>void gtk_toggle_button_toggled (GtkToggleButton *toggle_button);</PRE></CODE></BLOCKQUOTE><P>这个会切换该按钮, 并送出"toggled"信号.<P><H2><A NAME="ss6.3">6.3 Check按钮</A></H2><P>Check按钮有很多性质与双态按钮一样, 但外观看起来不同.在文字上没有边框, 而在左边有个小方块.这个在软体中选择要不要某个选项用得很频繁.<P>两个产生的函数跟一般按钮一样.<P><BLOCKQUOTE><CODE><PRE>GtkWidget* gtk_check_button_new (void);GtkWidget* gtk_check_button_new_with_label (gchar *label);</PRE></CODE></BLOCKQUOTE><P>new_with_label函数产生一个check按钮并带一个标签在其右侧.<P>测试check按钮的方法跟双态按钮一样.<P><H2><A NAME="ss6.4">6.4 Radio Buttons</A></H2><P>Radio按钮与check按钮很像, 除了它们是成群的. 因而我们可以在一群中选择其中一个.<P>产生一个新的radio按钮是由以下函数所达成的:<P><BLOCKQUOTE><CODE><PRE>GtkWidget* gtk_radio_button_new (GSList *group);GtkWidget* gtk_radio_button_new_with_label (GSList *group, gchar *label);</PRE></CODE></BLOCKQUOTE><P>您看到有个额外的参数. 因为它需要一个group来达成这项工作.第一个函数可以用NULL来做参数.然後产生一个group:<P><BLOCKQUOTE><CODE><PRE>GSList* gtk_radio_button_group (GtkRadioButton *radio_button);</PRE></CODE></BLOCKQUOTE><P><P>然後传这个group做为第一个参数给gtk_radio_button_new或new_with_label.您也可以乾脆指明那一个是内定的.<P><BLOCKQUOTE><CODE><PRE>void gtk_toggle_button_set_state (GtkToggleButton *toggle_button, gint state);</PRE></CODE></BLOCKQUOTE><P>这个跟双态按钮一样.<P><HR><A HREF="gtk_tut-5.html" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/gtk_tut-5.html"><IMG SRC="prev.gif" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/prev.gif" ALT="Previous"></A><A HREF="gtk_tut-7.html" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/gtk_tut-7.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#toc6" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/gtk_tut.html#toc6"><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 + -