lf332, SoftwareDevelopment: 用 GTK 编写 GUI 程序 – 3
原始地址:http://www.linuxfocus.org/ChineseGB/March2004/article332.shtml
by Özcan Güngör 关于作者: 我现在正在服兵役,身份是 Linux、Oracle 管理员和 web 程序员。 目录: |
用 GTK 编写 GUI 程序 – 3
摘要: 通过本系列文章,我们将要学习如果用 GTK 编写图形用户界面 (GUI)。 我自己也不知道要写多长。为了理解这些文章,你需要知道这些 C 语言知识:
强烈推荐你阅读以前的章节: |
切换按钮
这个按钮外观上和普通按钮一样,但是有两个状态:被按下或者没有被按下。 用下面的两个函数之一来创建切换按钮:
1 2 | GtkWidget *toggle=gtk_toggle_button_new(void); GtkWidget *toggle=gtk_toggle_button_new_with_label(const gchar *label); |
第一个函数创建了一个没有文字标签的切换按钮,但是第二个创建的切换按钮上有字符串 label 标签。
可以用下面的函数来设置它的状态:
1 2 | gtk_toggle_button_set_active (GtkToggleButton *toggle_button, gboolean is_active); |
toggle_button 是你想改变状态的按钮, is_active 是按钮的状态(0 或 1)。当它是 0 的时候,按钮不能被按下,当它是 1 的时候按钮可以被按下。
下面的函数用来得到按钮的状态:
1 | gboolean gtk_toggle_button_get_active(GtkToggleButton *button); |
切换按钮可以连接一个“切换”事件。
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #include <gtk/gtk.h> void togg(GtkWidget *widget, gpointer *data){ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data))) g_print("State is 1\n"); else g_print("State is 0\n"); } int main( int argc,char *argv[] ) { GtkWidget *window; GtkWidget *button; gtk_init (&argc, &argv); /* Create a new window */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "Toggle Button"); /* Connect destroy event to the window. */ gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(gtk_main_quit), NULL); /* Creates a toggle button */ button=gtk_toggle_button_new_with_label("I'm a toggle button"); /* Add the button to window */ gtk_container_add(GTK_CONTAINER(window),button); /* Connect "toggled" event to the button */ gtk_signal_connect (GTK_OBJECT (button), "toggled", GTK_SIGNAL_FUNC(togg),(gpointer *)button); gtk_widget_show(button); gtk_widget_show (window); gtk_main (); return(0); } |
复选按钮
复选按钮(也叫作复选框)是切换按钮的一个子类。 可以用来选择一些选项。
用下面的函数创建复选按钮:
GtkWidget* gtk_check_button_new (void);
GtkWidget* gtk_check_button_new_with_label (const gchar *label);
解释和切换按钮一样。
例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 #include <gtk/gtk.h>
void togg(GtkWidget *widget, gpointer *data){
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data)))
g_print("State is 1\n");
else
g_print("State is 0\n");
}
int main( int argc,char *argv[] )
{
GtkWidget *window;
GtkWidget *button;
gtk_init (&argc, &argv);
/* Create a new window */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "Check Button");
/* Connect destroy event to the window. */
gtk_signal_connect (GTK_OBJECT (window), "destroy",
GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
/* Creates a check button */
button=gtk_check_button_new_with_label("I'm a check button");
/* Add the button to window */
gtk_container_add(GTK_CONTAINER(window),button);
/* Connect "toggled" event to the button */
gtk_signal_connect (GTK_OBJECT (button), "toggled",
GTK_SIGNAL_FUNC(togg), (gpointer *)button);
gtk_widget_show(button);
gtk_widget_show (window);
gtk_main ();
return(0);
}标签
标签允许你在窗口的任何地方放置文本。
用下面的函数创建标签:
1 GtkWidget* gtk_label_new(const gchar *text);通过函数
1 gtk_label_set_text(GtkLabel *label, gchar *text);你可以在任何时候改变标签上的字符串。
1 gtk_label_set_justify(GtkLabel *label, GtkJustification jtype);gtk_label_set_justify 函数用来对齐标签上的文本。 jtype 可以是
- GTK_JUSTIFY_LEFT 把文本左对齐
- GTK_JUSTIFY_RIGHT 把文本右对齐
- GTK_JUSTIFY_CENTER 把文本居中
- GTK_JUSTIFY_FILL 标签上的文本两端对齐
1 | gtk_label_set_line_wrap (GtkLabel *label,gboolean wrap); |
的作用是当文本比放置它的空间长的时候,让文本可以被分割多很多段。 当 warp 是 1 的时候,文本会被换到下一行,否则就不会。
1 | gtk_label_get(GtkLabel *label, gchar **str) |
用来得到标签上的文本,并且存储到 str 中。
工具提示
工具提示是当你把鼠标放到一个窗口的小部件上面出现的文本。例如,你可以给按钮设置一个提示,当你把鼠标移到上面就会出现“发送信息”的文本。
要做到这些,你必须先创建一个小部件:
1 | GtkToolTips* gtk_tooltips_new(); |
然后把工具提示附加到这个小部件上:
1 2 | gtk_tooltips_set_tip(GtkTooltips *tooltips, GtkWidget *widget, const gchar *tip_text,const gchar *tip_private); |
一个小例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #include <gtk/gtk.h> int main( int argc,char *argv[] ) { GtkWidget *window; GtkWidget *button; GtkTooltips *tip; gtk_init (&argc, &argv); /* Create a new window */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "Tooltips"); /* Connect destroy event to the window. */ gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_main_quit), NULL); /* Creates a button */ button=gtk_button_new_with_label("I'm a Button"); /* Add the button to window */ gtk_container_add(GTK_CONTAINER(window),button); /* Creates a tooltips*/ tip=gtk_tooltips_new(); /* Attache this tooltips to button with text*/ gtk_tooltips_set_tip(tip, button, "Click me!",NULL); gtk_widget_show(button); gtk_widget_show (window); gtk_main (); return(0); } |
其他的函数:
1 | gtk_tooltips_enable (GtkTooltips *tooltips); |
激活工具提示。
1 | gtk_tooltips_disable (GtkTooltips *tooltips); |
禁止工具提示。
要得到一个小部件的工具提示,我们需要
1 | GtkTooltipsData* gtk_tooltips_get_data(GtkWidget *widget); |
GtkTooltipsData 是一个如下的结构:
1 2 3 4 5 6 7 8 9 10 | struct _GtkTooltipsData { GtkTooltips *tooltips; GtkWidget *widget; gchar *tip_text; gchar *tip_private; GdkFont *font; gint width; GList *row; }; |
设置文本出现的延迟,
1 | gtk_tooltips_set_delay (GtkTooltips *tip, guint delay) |
组合框
组合框是一个有下拉列表的可以编辑的文本框。 你既可以输入内容,也可以从下拉列表中选择一项。
可以这样创建一个组合框
1 | GtkWidget *gtk_combo_new(); |
并且我们需要一个 GList 结构的选项列表。
1 | GList *glist=NULL; |
可以这样给列表追加选项
1 | GList *g_list_append(GList *list, gchar *option); |
然后把这个列表添加到组合框中
1 | gtk_combo_set_popdown_strings(GtkCombo *combo, GList *List); |
组合框已经准备好了。用这种方法读取被选择的项目:
1 | gchar *gtk_entry_get_text(GtkEntry *entry); |
这样,GTK_ENTRY(GTK_COMBO(combo)->entry)) 就是 entry。
1 | gtk_combo_set_use_arrows(GtkCombo *combo,gint val); |
这个函数的作用是激活或者禁止用键盘上的上下键来更改组合框的值。 如果 val 是 0,这些键不起作用,否则这些键可以改变值。 但是如果组合框的值和列表中的值不相同,这些键就不起作用。
1 | gtk_combo_set_use_arrows_always(GtkCombo *combo,gint val); |
这个函数和 gtk_combo_set_use_arrows 相同, 但是当组合框的值和列表中的值不相同,这些键就能起作用。
1 2 | gtk_combo_set_value_in_list(GtkCombo *combo, gboolean val, gboolean ok_if_empty); |
如果n val 是 1,你可以输入一个列表中的值。 如果 ok_if_empty 是 1,这个值可以是空值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | #include <gtk/gtk.h> void act(GtkWidget *widget, gpointer *data){ g_print((gchar *)data); } int main( int argc,char *argv[] ) { GtkWidget *window; GtkWidget *combo; GtkWidget *button; GtkWidget *box; GList *list=NULL; list=g_list_append(list,"Slackware"); list=g_list_append(list,"RedHat"); list=g_list_append(list,"SuSE"); gtk_init (&argc, &argv); /* Create a new window */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "Combo Box"); /* Connect destroy event to the window. */ gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(gtk_main_quit), NULL); /* Create a new horizontal box */ box=gtk_hbox_new(1,0); gtk_container_add(GTK_CONTAINER(window),box); /* Creates a combo box */ combo=gtk_combo_new(); /* Sets the list */ gtk_combo_set_popdown_strings(GTK_COMBO(combo),list); /* Enables up/down keys change the value. */ gtk_combo_set_use_arrows_always(GTK_COMBO(combo),1); gtk_box_pack_start(GTK_BOX(box), combo,1,1,1); button=gtk_button_new_with_label("Write it"); gtk_signal_connect(GTK_OBJECT(button),"clicked",GTK_SIGNAL_FUNC(act), gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry))); gtk_box_pack_start(GTK_BOX(box), button,1,1,1); gtk_widget_show(box); gtk_widget_show(combo); gtk_widget_show(button); gtk_widget_show (window); gtk_main (); return(0); } |
欢迎所有的评论。