纳须弥

海纳百川
有容乃大

GTK从入门到放弃

目录

编译方法

编译脚本

01.一个简单的按钮

02.两个按钮

03.vbox:一张图片+一个按钮

04.一个简单的提示窗口:下一步+上一步+确定

05.多按钮:一个简单的键盘

06.一个简单的画图draw界面

07.带图片的按钮

08.多选按钮check button

09.单选按钮radio button

10.控制条scrollbar

11.箭头按钮create\_arrow\_button

12.标签label

12.子窗口:触发事件打开窗口

13.进度条progressbar

14.窗口标尺gtk\_hruler\_new

15.状态栏(条)gtk\_statusbar\_new

另一个例子

16.文本输入gtk\_entry\_new:可见/不可见,可输入/不可输入

规定最大长度的gtk\_entry\_new\_with\_max_length

输入文本执行一条命令

17.文件选择:gtk\_file\_selection_new

18.事件盒子gtk\_event\_box_new

19.固定容器:gtk\_fixed\_new

20.一个简单的frame:gtk\_frame\_new(不同于java的JFrame)

gtk\_aspect\_frame_new:更多选项的frame

21.滚动窗口:gtk\_scrolled\_window_new

又一个例子:滚动窗口中放按钮

22.按钮盒子:button box

显示动态图:直接引用GIF,用多张图片显示动图效果

24.画图接口:gdk\_draw\_arc,gdk\_draw\_rectangle

25.文本文件编辑gtk\_text\_view_new

26.菜单/工具栏:gtk\_menu\_new

27.工具栏/条:gtk\_toolbar\_new

28.浮动的工具条的菜单

29.一个文本编辑器:包含menu,toolbar,statusbar

30.模拟90坦克游戏:在frame中移动一个图片,键盘控制走向

31.pixmap:

32.固定调节数值的按钮:gtk\_spin\_button\_new\_with_range

33.分隔面板:gtk\_hpanel\_new,gtk\_vpanel\_new(未编译)

34.会话窗口:gtk\_button\_new\_from\_stock

35.字体选择:gtk\_font\_selection\_dialog\_new

36.几个画图的骚操作:gtk\_drawing\_area_new

先给出三个例子的效果:

代码1效果

代码2效果

代码3效果

代码1

代码2

代码3

最后寄语


编译方法

$ gcc main.c `pkg-config --libs --cflags gtk+-3.0`

或者使用gtk-2.0。

编译脚本

#!/bin/bashif [ $# -lt 1 ]; then    echo "usage: $0 [main.c]"    exitfi gcc -o a $1 `pkg-config --libs --cflags gtk+-2.0`

01.一个简单的按钮

#include <gtk/gtk.h>//#include "temp.c" /* 这是一个回调函数。data 参数在本示例中被忽略。 * 后面有更多的回调函数示例。*/void hello( GtkWidget *widget, gpointer   data ){    g_print ("Hello World\n");//temp(data );} gint delete_event( GtkWidget *widget, GdkEvent  *event, gpointer   data ){    /* 如果你的 "delete_event" 信号处理函数返回 FALSE,GTK 会发出 "destroy" 信号。     * 返回 TRUE,你不希望关闭窗口。     * 当你想弹出“你确定要退出吗?”对话框时它很有用。*/     g_print ("delete event occurred\n");     /* 改 TRUE 为 FALSE 程序会关闭。*/     return FALSE;} /* 另一个回调函数 */void destroy( GtkWidget *widget, gpointer   data ){    gtk_main_quit ();} int main( int   argc, char *argv[] ){    /* GtkWidget 是构件的存储类型 */    GtkWidget *window;    GtkWidget *button;        /* 这个函数在所有的 GTK 程序都要调用。参数由命令行中解析出来并且送到该程序中*/    gtk_init (&argc, &argv);        /* 创建一个新窗口 */    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);        /* 当窗口收到 "delete_event" 信号 (这个信号由窗口管理器发出,通常是“关闭”     * 选项或是标题栏上的关闭按钮发出的),我们让它调用在前面定义的 delete_event() 函数。     * 传给回调函数的 data 参数值是 NULL,它会被回调函数忽略。*/    g_signal_connect (G_OBJECT (window), "delete_event",        G_CALLBACK (delete_event), NULL);        /* 在这里我们连接 "destroy" 事件到一个信号处理函数。       * 对这个窗口调用 gtk_widget_destroy() 函数或在 "delete_event" 回调函数中返回 FALSE 值     * 都会触发这个事件。*/    g_signal_connect (G_OBJECT (window), "destroy",        G_CALLBACK (destroy), NULL);        /* 设置窗口边框的宽度。*/    gtk_container_set_border_width (GTK_CONTAINER (window), 10);        /* 创建一个标签为 "Hello World" 的新按钮。*/    button = gtk_button_new_with_label ("Hello World");        /* 当按钮收到 "clicked" 信号时会调用 hello() 函数,并将NULL传给     * 它作为参数。hello() 函数在前面定义了。*/    g_signal_connect (G_OBJECT (button), "clicked",        G_CALLBACK (hello), "1");        /* 当点击按钮时,会通过调用 gtk_widget_destroy(window) 来关闭窗口。     * "destroy" 信号会从这里或从窗口管理器发出。*/   // g_signal_connect_swapped (G_OBJECT (button), "clicked",   //      G_CALLBACK (gtk_widget_destroy),window);        /* 把按钮放入窗口 (一个 gtk 容器) 中。*/    gtk_container_add (GTK_CONTAINER (window), button);        /* 最后一步是显示新创建的按钮和窗口 */    gtk_widget_show (button);    gtk_widget_show (window);        /* 所有的 GTK 程序必须有一个 gtk_main() 函数。程序运行停在这里     * 等待事件 (如键盘事件或鼠标事件) 的发生。*/    gtk_main ();        return 0;}

02.两个按钮

#include <gtk/gtk.h>/* 我们新改进的回调函数。传递到该函数的数据将打印到标准输出(stdout)。*/void callback( GtkWidget *widget, gpointer data ){       g_print ("%s ", (gchar *) data);}/* 另一个回调函数 */gint delete_event( GtkWidget *widget, GdkEvent *event, gpointer data ){     gtk_main_quit ();     return FALSE;} int main( int argc, char *argv[] ){/* GtkWidget 是构件的存储类型 */      GtkWidget *window;      GtkWidget *button;      GtkWidget *box1;       gtk_init (&argc, &argv);/* 创建一个新窗口 */      window = gtk_window_new (GTK_WINDOW_TOPLEVEL);/* 这是一个新的调用,设置窗口标题为"Hello Buttons!" */      gtk_window_set_title (GTK_WINDOW (window), "Hello Buttons!");/* 在这里我们为 delete_event 设置了一个处理函数来立即退出 GTK。*/      g_signal_connect (G_OBJECT (window), "delete_event",                        G_CALLBACK (delete_event), NULL);/* 设置窗口边框的宽度。 */      gtk_container_set_border_width (GTK_CONTAINER (window), 20);/* 我们创建了一个组装盒。详情参见“组装”章节。我们看不见组装盒,它仅被作为排列构件的工具。*/      box1 = gtk_hbox_new (FALSE, 1);/* 把组装盒放入主窗口中。*/      gtk_container_add (GTK_CONTAINER (window), box1);/* 创建一个标签为 "Button 1" 的新按钮。*/      button = gtk_button_new_with_label ("Hello");/* 当按钮被按下时,我们调用 "callback" 函数,并将一个指向 "button 1" 的指针作为它的参数。*/      g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), "hello");/* 代替 gtk_container_add,我们把按钮放入不可见的组装盒,该组合盒已经组装进窗口中了。*/      gtk_box_pack_start (GTK_BOX(box1), button, TRUE, TRUE, 0);/* 总是记住这一步,它告诉 GTK 我们为这个按钮做的准备工作已经完成了,现在可以显示它了。*/      gtk_widget_show (button);/* 同样创建第二个按钮。*/      button = gtk_button_new_with_label ("World");      g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), "World");      gtk_box_pack_start(GTK_BOX (box1), button, TRUE, TRUE, 0);      gtk_widget_show (button);/* 同样创建第3个按钮。*/      button = gtk_button_new_with_label ("!");      g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), "!");      gtk_box_pack_start(GTK_BOX (box1), button, TRUE, TRUE, 0);      gtk_widget_show (button);       gtk_widget_show (box1);      gtk_widget_show (window);/* 停在这里等待事件发生。*/      gtk_main ();      return 0;}

03.vbox:一张图片+一个按钮

/* 创建SPLASH窗口 splash.c */#include <gtk/gtk.h>//主函数int main (int argc,char* argv[]){   GtkWidget* window ;   GtkWidget* vbox ;   GtkWidget* image ;   GtkWidget* button ;    gtk_init(&argc,&argv);    window = gtk_window_new(GTK_WINDOW_POPUP);//////////no boundary   gtk_window_set_title(GTK_WINDOW(window),"Splash窗口");   g_signal_connect(G_OBJECT(window),"destroy",      G_CALLBACK(gtk_main_quit),NULL);   //gtk_container_set_border_width(GTK_CONTAINER(window),20);   //gtk_window_set_default_size(GTK_WINDOW(window),500,400);   //gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);    vbox = gtk_vbox_new(FALSE,0);   gtk_container_add(GTK_CONTAINER(window),vbox);   image = gtk_image_new_from_file("b.png");   gtk_box_pack_start(GTK_BOX(vbox),image,FALSE,FALSE,0);   button = gtk_button_new_with_label("Splash窗口");   g_signal_connect(G_OBJECT(button),"clicked",      G_CALLBACK(gtk_main_quit),NULL);   gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,0);   gtk_widget_show_all(window);   gtk_main();   return FALSE;}

04.一个简单的提示窗口:下一步+上一步+确定

/* 每日提示 tips.c */#include <gtk/gtk.h>//XPM格式的图像数据,以C语言源代码形式存于文件中static char * book_open_xpm[] = {   "16 16 4 1",   " c None s None",   ". c black",   "X c #808080",   "o c white",   " ",   " .. ",   " .Xo. ... ",   " .Xoo. ..oo. ",   " .Xooo.Xooo... ",   " .Xooo.oooo.X. ",   " .Xooo.Xooo.X. ",   " .Xooo.oooo.X. ",   " .Xooo.Xooo.X. ",   " .Xooo.oooo.X. ",   " .Xoo.Xoo..X. ",   " .Xo.o..ooX. ",   " .X..XXXXX. ",   " ..X....... ",   " .. ",   " "};//自定义提示信息static gchar *info[5] = {   "此软件用于测试每日提示功能的实现,如果你发现问题请及时回复。",   "我们的目的是把GTK+2.0的大多数功能奉献给每一位自由软件爱好者和开发者。",   "每一位Linux的支持者都会让我们增加一分信心,Linux最终仍是台式计算机操作系统。",   "计算机软件技术是一种科学技术,它和人类历史上其他的科学技术一样,是允许每一人自由使用的。",   "当前你测试完此程序后,请设法把它附加到你创作的软件当中去,这是你成功的第一步。"};static GtkWidget *window; //主窗口static GtkWidget *frame; //框架static GtkWidget *pre_button; //上一提示按钮static GtkWidget *next_button; //下一提示按钮static GtkWidget *label; //提示信息内容标签static GtkWidget *title; //框架的标题gint current_info = 0 ;//当前提示信息计数GtkWidget* create_title (GtkWidget *data){ //创建框架控件的标题   GtkWindow *title;   GtkWidget *hbox;   GtkWidget *image;   GtkWidget *label;   GdkPixmap *pixmap;   GdkBitmap *mask;   pixmap = gdk_pixmap_create_from_xpm_d(                  data->window,&mask,                  &GTK_WIDGET(data)->style->white,                  book_open_xpm);   image = gtk_image_new_from_pixmap(pixmap,NULL);   label = gtk_label_new("新的标题");   hbox = gtk_hbox_new(FALSE,0);   gtk_box_pack_start(GTK_BOX(hbox),image,FALSE,FALSE,2);   gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,2);   return hbox ;}GtkWidget* create_button (gchar* stockid,gchar* title){ //创建带图像的按钮   GtkWidget *button;   GtkWidget *image;   GtkWidget *label;   GtkWidget *hbox;   image = gtk_image_new_from_stock(stockid,GTK_ICON_SIZE_MENU);   label = gtk_label_new(title);   hbox = gtk_hbox_new(FALSE,0);   gtk_box_pack_start(GTK_BOX(hbox),image,FALSE,FALSE,3);   gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,3);   button = gtk_button_new();   gtk_container_add(GTK_CONTAINER(button),hbox);   return button;}void pre_info (GtkButton *button,gpointer data){ //上一提示   gint i ;   i = current_info - 1 ;   if(i == -1) return ;   if(i == 0 ) gtk_widget_set_sensitive(pre_button,FALSE);   current_info = i ;   gtk_widget_set_sensitive(next_button,TRUE);   gtk_label_set_text(GTK_LABEL(label),info[current_info]);}void next_info (GtkButton *button,gpointer data){ //下一提示   gint i ;   i = current_info + 1 ;   if(i == 5) return ;   if(i == 4) gtk_widget_set_sensitive(next_button,FALSE);   current_info = i ;   gtk_widget_set_sensitive(pre_button,TRUE);   gtk_label_set_text(GTK_LABEL(label),info[current_info]);}int main ( int argc , char* argv[]){   GtkWidget *hbox ;   GtkWidget *vbox;   GtkWidget *bbox;   GtkWidget *button;   GtkWidget *image;   GtkWidget *title;   gtk_init(&argc,&argv);   window = gtk_window_new(GTK_WINDOW_TOPLEVEL);   g_signal_connect(G_OBJECT(window),"delete_event",         G_CALLBACK(gtk_main_quit),NULL);   gtk_window_set_title(GTK_WINDOW(window),"每日提示");   gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);   gtk_container_set_border_width(GTK_CONTAINER(window),10);   gtk_widget_realize(window);   vbox = gtk_vbox_new(FALSE,0);   gtk_container_add(GTK_CONTAINER(window),vbox);   hbox = gtk_hbox_new(FALSE,0);   gtk_box_pack_start(GTK_BOX(vbox),hbox,TRUE,TRUE,5);   image = gtk_image_new_from_file("l.bmp");   gtk_box_pack_start(GTK_BOX(hbox),image,FALSE,FALSE,5);   frame = gtk_frame_new(NULL);   title = create_title(window);   gtk_frame_set_label_widget(GTK_FRAME(frame),title);   gtk_box_pack_start(GTK_BOX(hbox),frame,TRUE,TRUE,5);   label = gtk_label_new(NULL);   gtk_label_set_text(GTK_LABEL(label),info[0]);   gtk_label_set_line_wrap(GTK_LABEL(label),TRUE);   gtk_container_add(GTK_CONTAINER(frame),label);   bbox = gtk_hbutton_box_new();   gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox),GTK_BUTTONBOX_END);   gtk_box_set_spacing(GTK_BOX(bbox),5);   gtk_box_pack_start(GTK_BOX(vbox),bbox,FALSE,FALSE,5);   button = gtk_check_button_new_with_label("每次启动时显示");   gtk_box_pack_start(GTK_BOX(bbox),button,FALSE,FALSE,5);   pre_button = create_button(GTK_STOCK_GO_BACK,"上一提示");   gtk_widget_set_sensitive(pre_button,FALSE);   g_signal_connect(G_OBJECT(pre_button),"clicked",         G_CALLBACK(pre_info),NULL);   gtk_box_pack_start(GTK_BOX(bbox),pre_button,FALSE,FALSE,5);   next_button = create_button(GTK_STOCK_GO_FORWARD,"下一提示");   g_signal_connect(G_OBJECT(next_button),"clicked",         G_CALLBACK(next_info),NULL);   gtk_box_pack_start(GTK_BOX(bbox),next_button,FALSE,FALSE,5);   button = gtk_button_new_from_stock(GTK_STOCK_OK);   g_signal_connect(G_OBJECT(button),"clicked",         G_CALLBACK(gtk_main_quit),NULL);   gtk_box_pack_start(GTK_BOX(bbox),button,FALSE,FALSE,5);   gtk_widget_show_all(window);   gtk_main();   return FALSE;}

效果:

05.多按钮:一个简单的键盘

#include <gtk/gtk.h>/* 我们的回调。* 传到这个函数的数据被打印到标准输出 */void callback( GtkWidget *widget, gpointer data ){    g_print ("%s", (char *) data);}/* 这个回调退出程序 */gint delete_event( GtkWidget *widget, GdkEvent *event, gpointer data ){    gtk_main_quit ();    return FALSE;}int main( int argc, char *argv[] ){    GtkWidget *window;    GtkWidget *button;    GtkWidget *table;    gtk_init (&argc, &argv);/* 创建一个新窗口 */    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);/* 设置窗口标题 */    gtk_window_set_title (GTK_WINDOW (window), "Rong Tao's Keyboard");/* 为 delete_event 设置一个立即退出 GTK 的处理函数。 */    g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL);/* 设置窗口的边框宽度。 */    gtk_container_set_border_width (GTK_CONTAINER (window), 20);/* 创建一个 2x2 的表 */    table = gtk_table_new (4, 20, TRUE);/* 将表放进主窗口 */    gtk_container_add (GTK_CONTAINER (window), table);/* 创建第一个按钮 */    button = gtk_button_new_with_label ("Q");/* 当这个按钮被点击时,我们调用 "callback" 函数,并将一个指向"button 1"的指针作为它的参数 */    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "q");/* 将 button 1 插入表的左上象限(quadrant) */    gtk_table_attach_defaults (GTK_TABLE (table), button, 0, 2, 0, 1);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("W");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "w");    gtk_table_attach_defaults (GTK_TABLE (table), button, 2, 4, 0, 1);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("E");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "e");    gtk_table_attach_defaults (GTK_TABLE (table), button, 4, 6, 0, 1);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("R");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "r");    gtk_table_attach_defaults (GTK_TABLE (table), button, 6, 8, 0, 1);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("T");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "t");    gtk_table_attach_defaults (GTK_TABLE (table), button, 8, 10, 0, 1);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("Y");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "y");    gtk_table_attach_defaults (GTK_TABLE (table), button, 10, 12, 0, 1);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("U");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "u");    gtk_table_attach_defaults (GTK_TABLE (table), button, 12, 14, 0, 1);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("I");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "i");    gtk_table_attach_defaults (GTK_TABLE (table), button, 14, 16, 0, 1);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("O");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "o");    gtk_table_attach_defaults (GTK_TABLE (table), button, 16, 18, 0, 1);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("P");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "p");    gtk_table_attach_defaults (GTK_TABLE (table), button, 18, 20, 0, 1);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("A");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "a");    gtk_table_attach_defaults (GTK_TABLE (table), button, 1, 3, 1, 2);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("S");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "s");    gtk_table_attach_defaults (GTK_TABLE (table), button, 3, 5, 1, 2);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("D");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "d");    gtk_table_attach_defaults (GTK_TABLE (table), button, 5, 7, 1, 2);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("F");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "f");    gtk_table_attach_defaults (GTK_TABLE (table), button, 7, 9, 1, 2);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("G");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "g");    gtk_table_attach_defaults (GTK_TABLE (table), button, 9, 11, 1, 2);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("H");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "h");    gtk_table_attach_defaults (GTK_TABLE (table), button, 11, 13, 1, 2);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("J");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "j");    gtk_table_attach_defaults (GTK_TABLE (table), button, 13, 15, 1, 2);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("K");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "k");    gtk_table_attach_defaults (GTK_TABLE (table), button, 15, 17, 1, 2);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("L");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "l");    gtk_table_attach_defaults (GTK_TABLE (table), button, 17, 19, 1, 2);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("'");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "'");    gtk_table_attach_defaults (GTK_TABLE (table), button, 0, 2, 2, 3);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("Z");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "z");    gtk_table_attach_defaults (GTK_TABLE (table), button, 2, 4, 2, 3);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("X");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "x");    gtk_table_attach_defaults (GTK_TABLE (table), button, 4, 6, 2, 3);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("C");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "c");    gtk_table_attach_defaults (GTK_TABLE (table), button, 6, 8, 2, 3);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("V");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "v");    gtk_table_attach_defaults (GTK_TABLE (table), button, 8, 10, 2, 3);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("B");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "b");    gtk_table_attach_defaults (GTK_TABLE (table), button, 10, 12, 2, 3);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("N");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "n");    gtk_table_attach_defaults (GTK_TABLE (table), button, 12, 14, 2, 3);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("M");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "m");    gtk_table_attach_defaults (GTK_TABLE (table), button, 14, 16, 2, 3);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label (",");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) ",");    gtk_table_attach_defaults (GTK_TABLE (table), button, 16, 18, 2, 3);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label (".");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) ".");    gtk_table_attach_defaults (GTK_TABLE (table), button, 18, 20, 2, 3);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label ("Enter");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "\n");    gtk_table_attach_defaults (GTK_TABLE (table), button, 2, 6, 3, 4);    gtk_widget_show (button);/*********************/    button = gtk_button_new_with_label (" ");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) " ");    gtk_table_attach_defaults (GTK_TABLE (table), button, 6, 16, 3, 4);    gtk_widget_show (button);/* 创建"Quit"按钮 */    button = gtk_button_new_with_label ("Quit");/* 当这个按钮被点击时,我们调用 "delete_event" 函数接着程序就退出了 */    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (delete_event), NULL);/* 将退出按钮插入表的下面两个象限 */    gtk_table_attach_defaults (GTK_TABLE (table), button, 16, 19, 3, 4);    gtk_widget_show (button);     gtk_widget_show (table);    gtk_widget_show (window);    gtk_main ();    return 0;}

06.一个简单的画图draw界面

/* 绘图软件 brush.c */#include <gtk/gtk.h>static GtkWidget *window = NULL;static GdkPixmap *pixmap = NULL;static gbooleanscribble_configure_event (GtkWidget *widget,GdkEventConfigure *event,gpointer data){   if (pixmap)   g_object_unref (G_OBJECT (pixmap));   pixmap = gdk_pixmap_new (widget->window,   widget->allocation.width,   widget->allocation.height,-1);   gdk_draw_rectangle (pixmap,widget->style->white_gc,                        TRUE,0,0,widget->allocation.width,                        widget->allocation.height);   return TRUE;}static gboolean scribble_expose_event (GtkWidget *widget,GdkEventExpose *event,gpointer data){   gdk_draw_drawable (widget->window,                        widget->style->fg_gc[GTK_WIDGET_STATE (widget)],                        pixmap,                        event->area.x, event->area.y,                        event->area.x, event->area.y,                        event->area.width, event->area.height);   return FALSE;}static void draw_brush (GtkWidget *widget, gdouble x, gdouble y){   GdkRectangle update_rect;   update_rect.x = x - 3;   update_rect.y = y - 3;   update_rect.width = 6;   update_rect.height = 6;   gdk_draw_rectangle (pixmap,                        widget->style->black_gc,                        TRUE,                        update_rect.x, update_rect.y,                        update_rect.width, update_rect.height);                        gdk_window_invalidate_rect (widget->window,                        &update_rect,                        FALSE);}static gboolean scribble_button_press_event (GtkWidget *widget,GdkEventButton *event,gpointer data){   if (pixmap == NULL)      return FALSE;   if (event->button == 1)      draw_brush (widget, event->x, event->y);   return TRUE;}static gboolean scribble_motion_notify_event (GtkWidget *widget,GdkEventMotion *event,gpointer data){   int x, y;   GdkModifierType state;   if (pixmap == NULL)      return FALSE;   gdk_window_get_pointer (event->window, &x, &y, &state);   if (state & GDK_BUTTON1_MASK)      draw_brush (widget, x, y);   return TRUE;}static gboolean checkerboard_expose (GtkWidget *da, GdkEventExpose *event,gpointer data){   gint i, j, xcount, ycount;   GdkGC *gc1, *gc2;   GdkColor color;#define CHECK_SIZE 10#define SPACING 2   gc1 = gdk_gc_new (da->window);   color.red = 30000;   color.green = 0;   color.blue = 30000;   gdk_gc_set_rgb_fg_color (gc1, &color);   gc2 = gdk_gc_new (da->window);   color.red = 65535;   color.green = 65535;   color.blue = 65535;   gdk_gc_set_rgb_fg_color (gc2, &color);   xcount = 0;   i = SPACING;   while (i < da->allocation.width)   {      j = SPACING;      ycount = xcount % 2;      while (j < da->allocation.height)      {         GdkGC *gc;         if (ycount % 2)            gc = gc1;         else            gc = gc2;         gdk_draw_rectangle (da->window, gc, TRUE,                              i, j, CHECK_SIZE, CHECK_SIZE);         j += CHECK_SIZE + SPACING;         ++ycount;      }      i += CHECK_SIZE + SPACING;      ++xcount;   }   g_object_unref (G_OBJECT (gc1));   g_object_unref (G_OBJECT (gc2));   return TRUE;}int main (int argc,char* argv[]){   GtkWidget *frame;   GtkWidget *vbox;   GtkWidget *da;   GtkWidget *label;    gtk_init(&argc,&argv);    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);   gtk_window_set_title (GTK_WINDOW (window), "绘图软件");   g_signal_connect (G_OBJECT(window), "delete_event",         G_CALLBACK (gtk_main_quit), NULL);   gtk_container_set_border_width (GTK_CONTAINER (window), 10);    vbox = gtk_vbox_new (FALSE, 8);   gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);   gtk_container_add (GTK_CONTAINER (window), vbox);    label = gtk_label_new (NULL);   gtk_label_set_markup (GTK_LABEL (label),"<u>绘图区域</u>");   gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);    frame = gtk_frame_new (NULL);   gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);   gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);    da = gtk_drawing_area_new ();   gtk_widget_set_size_request (da, 100, 100);   gtk_container_add (GTK_CONTAINER (frame), da);    g_signal_connect (da, "expose_event",         G_CALLBACK (scribble_expose_event), NULL);   g_signal_connect (da, "configure_event",         G_CALLBACK (scribble_configure_event), NULL);   g_signal_connect (da, "motion_notify_event",         G_CALLBACK (scribble_motion_notify_event), NULL);   g_signal_connect (da, "button_press_event",         G_CALLBACK (scribble_button_press_event), NULL);    gtk_widget_set_events (da, gtk_widget_get_events (da)                        | GDK_LEAVE_NOTIFY_MASK                        | GDK_BUTTON_PRESS_MASK                        | GDK_POINTER_MOTION_MASK                        | GDK_POINTER_MOTION_HINT_MASK);     gtk_widget_show_all (window);   gtk_main();   return FALSE;}

07.带图片的按钮

/* 带图像的按钮 button.c */#include <gtk/gtk.h>void on_button_clicked (GtkWidget* button,gpointer data){   //g_print("按钮 %s ",(gchar*)data);   g_print("Button %s is pressed.\n",(gchar*)data);   //g_print("被按了一下. \n");}//创建自己按钮的函数GtkWidget* create_button1 (void){   GtkWidget* box;   GtkWidget* image;   GtkWidget* label;   GtkWidget* button;   char* title = "文件家";   image = gtk_image_new_from_file("dir2.jpg");   label = gtk_label_new(title);   box = gtk_vbox_new(FALSE,2);   gtk_container_set_border_width(GTK_CONTAINER(box),5);   gtk_box_pack_start(GTK_BOX(box),image,FALSE,FALSE,3);   gtk_box_pack_start(GTK_BOX(box),label,FALSE,FALSE,3);   gtk_widget_show(image);   gtk_widget_show(label);   button = gtk_button_new();   gtk_container_add(GTK_CONTAINER(button),box);   gtk_widget_show(box);   return button ;}GtkWidget* create_button2 (void){   GtkWidget* box;   GtkWidget* image;   GtkWidget* label;   GtkWidget* button;   char* title = "蝙蝠侠";   image = gtk_image_new_from_file("batman.jpg");   label = gtk_label_new(title);   box = gtk_hbox_new(FALSE,2);   gtk_container_set_border_width(GTK_CONTAINER(box),5);   gtk_box_pack_start(GTK_BOX(box),image,FALSE,FALSE,3);   gtk_box_pack_start(GTK_BOX(box),label,FALSE,FALSE,3);   gtk_widget_show(image);   gtk_widget_show(label);   button = gtk_button_new();   gtk_container_add(GTK_CONTAINER(button),box);   gtk_widget_show(box);   return button ;}//主函数int main (int argc, char *argv[]){   GtkWidget* window;   GtkWidget* box;   GtkWidget* button1;   GtkWidget* button2;   GtkWidget* button3;   GtkWidget* button4;    gchar* title = "带图像和快捷键的按钮";   gchar* b1 = "Red apple";//"红苹果"   gchar* b2 = "Small mushroom";//"小蘑菇"   gchar* b3 = "Short key";//"快捷键"   gchar* b4 = "OK";//"确认"   gtk_init(&argc,&argv);   window = gtk_window_new(GTK_WINDOW_TOPLEVEL);   gtk_window_set_title(GTK_WINDOW(window),title);   gtk_container_set_border_width(GTK_CONTAINER(window),20);   g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);   box = gtk_hbox_new(FALSE,0);   gtk_container_add(GTK_CONTAINER(window),box);   button1 = create_button1();   g_signal_connect(G_OBJECT(button1),"clicked",   G_CALLBACK(on_button_clicked),(gpointer)b1);   gtk_box_pack_start(GTK_BOX(box),button1,FALSE,FALSE,5);   button2 = create_button2();   g_signal_connect(G_OBJECT(button2),"clicked",   G_CALLBACK(on_button_clicked),(gpointer)b2);   gtk_box_pack_start(GTK_BOX(box),button2,FALSE,FALSE,5);   button3 = gtk_button_new_with_mnemonic("快捷键(_H)");   g_signal_connect(G_OBJECT(button3),"clicked",   G_CALLBACK(on_button_clicked),(gpointer)b3);   gtk_box_pack_start(GTK_BOX(box),button3,FALSE,FALSE,5);   button4 = gtk_button_new_from_stock(GTK_STOCK_OK);   g_signal_connect(G_OBJECT(button4),"clicked",   G_CALLBACK(on_button_clicked),(gpointer)b4);   gtk_box_pack_start(GTK_BOX(box),button4,FALSE,FALSE,5);   gtk_widget_show_all(window);   gtk_main();   return FALSE ;}

08.多选按钮check button

/* 多项选择窗口 checkbutton.c */#include <gtk/gtk.h>gboolean isbold = FALSE ;gboolean isitli = FALSE ;gboolean isuline = FALSE ;gboolean iscolor = FALSE ;void on_check_clicked (GtkWidget* check,gint data){   switch((int)data)   {      case 1:         isbold = !isbold;         break;      case 2:         isitli = !isitli;         break;      case 3:         isuline = !isuline;         break;      case 4:         iscolor = !iscolor;         break;   }}void on_button_clicked (GtkWidget *button,gpointer data){   g_print("字体配置为:");   if(isbold)      g_print("粗体 ");   if(isitli)      g_print("斜体 ");   if(isuline)      g_print("下划线 ");   if(iscolor)      g_print("彩色 ");   if( !isbold && !iscolor && !isuline && !isitli )      g_print("正常,无任何选项");   g_print("\n");}//主函数int main (int argc, char *argv[]){   GtkWidget* window;   GtkWidget* frame;   GtkWidget* box;   GtkWidget* button;   GtkWidget* box1;   GtkWidget* check1;   GtkWidget* check2;   GtkWidget* check3;   GtkWidget* check4;   char* title = "多项选择窗口";   gtk_init(&argc,&argv);   window = gtk_window_new(GTK_WINDOW_TOPLEVEL);   gtk_window_set_title(GTK_WINDOW(window),title);   gtk_container_set_border_width(GTK_CONTAINER(window),20);   g_signal_connect(G_OBJECT(window),"destroy",         G_CALLBACK(gtk_main_quit),NULL);   box = gtk_vbox_new(FALSE,0);   gtk_container_add(GTK_CONTAINER(window),box);   frame = gtk_frame_new("字体选项:");   gtk_box_pack_start(GTK_BOX(box),frame,FALSE,FALSE,5);   box1 = gtk_vbox_new(FALSE,0);   gtk_container_add(GTK_CONTAINER(frame),box1);   gtk_container_set_border_width(GTK_CONTAINER(box1),10);   gtk_widget_show(box);   check1 = gtk_check_button_new_with_label(" 粗体 ");   g_signal_connect(G_OBJECT(check1),"released",         G_CALLBACK(on_check_clicked),(gpointer)1);   gtk_box_pack_start(GTK_BOX(box1),check1,FALSE,FALSE,3);   check2 = gtk_check_button_new_with_label(" 斜体 ");   g_signal_connect(G_OBJECT(check2),"released",         G_CALLBACK(on_check_clicked),(gpointer)2);   gtk_box_pack_start(GTK_BOX(box1),check2,FALSE,FALSE,3);   check3 = gtk_check_button_new_with_label(" 下划线 ");   g_signal_connect(G_OBJECT(check3),"released",         G_CALLBACK(on_check_clicked),(gpointer)3);   gtk_box_pack_start(GTK_BOX(box1),check3,FALSE,FALSE,3);   check4 = gtk_check_button_new_with_label(" 彩色 ");   g_signal_connect(G_OBJECT(check4),"released",         G_CALLBACK(on_check_clicked),(gpointer)4);   gtk_box_pack_start(GTK_BOX(box1),check4,FALSE,FALSE,3);   button = gtk_button_new_from_stock(GTK_STOCK_OK);   g_signal_connect(G_OBJECT(button),"clicked",         G_CALLBACK(on_button_clicked),NULL);   g_signal_connect_swapped(G_OBJECT(button),"clicked",         G_CALLBACK(gtk_widget_destroy),window);   gtk_box_pack_start(GTK_BOX(box),button,FALSE,FALSE,5);   gtk_widget_show_all(window);   gtk_main();   return FALSE ;}

09.单选按钮radio button

这里给出两个例子

#include <glib.h>#include <gtk/gtk.h>gint close_application( GtkWidget *widget, GdkEvent *event, gpointer data ){   gtk_main_quit ();   return FALSE;}int main( int argc, char *argv[] ){   GtkWidget *window = NULL;   GtkWidget *box1;   GtkWidget *box2;   GtkWidget *button;   GtkWidget *separator;   GSList *group;    gtk_init (&argc, &argv);    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);   g_signal_connect (G_OBJECT (window), "delete_event",                     G_CALLBACK (close_application), NULL);   gtk_window_set_title (GTK_WINDOW (window), "radio buttons");   gtk_container_set_border_width (GTK_CONTAINER (window), 0);     box1 = gtk_vbox_new (FALSE, 0);   gtk_container_add (GTK_CONTAINER (window), box1);   gtk_widget_show (box1);    box2 = gtk_hbox_new (FALSE, 10);   gtk_container_set_border_width (GTK_CONTAINER (box2), 10);   gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);   gtk_widget_show (box2);    button = gtk_radio_button_new_with_label (NULL, "Leonvel");   gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);   gtk_widget_show (button);    group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button));    button = gtk_radio_button_new_with_label (group, "Rong");   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);   gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);   gtk_widget_show (button);    button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (button),                                                         "Tao");   gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);   gtk_widget_show (button);    separator = gtk_hseparator_new ();   gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);   gtk_widget_show (separator);    box2 = gtk_vbox_new (FALSE, 10);   gtk_container_set_border_width (GTK_CONTAINER (box2), 10);   gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);   gtk_widget_show (box2);    button = gtk_button_new_with_label ("close");   g_signal_connect_swapped (G_OBJECT (button), "clicked",                             G_CALLBACK (close_application), window);   gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);                       GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);    gtk_widget_grab_default (button);   gtk_widget_show (button);   gtk_widget_show (window);   gtk_main ();   return 0;}

第二个例子

/* 单项选择窗口 radiobutton.c */#include <gtk/gtk.h>static gchar* red = " 红色 " ;static gchar* green = " 绿色 " ;static gchar* yellow = " 黄色 " ;static gchar* blue = " 蓝色 " ;void on_radio_clicked (GtkWidget* radio,gint data){   g_print("你选择的颜色是:");   switch((int)data)   {      case 1:         g_print("%s",red); break;      case 2:         g_print("%s",green); break;      case 3:         g_print("%s",yellow); break;      case 4:         g_print("%s",blue); break;   }   g_print("\n");}//主函数int main (int argc, char *argv[]){   GtkWidget* window;   GtkWidget* frame;   GtkWidget* box;   GtkWidget* box1;   GtkWidget* button1;   GtkWidget* radio1;   GtkWidget* radio2;   GtkWidget* radio3;   GtkWidget* radio4;   GSList* group;   gchar* title = "单项选择窗口" ;   gtk_init(&argc,&argv);   window = gtk_window_new(GTK_WINDOW_TOPLEVEL);   gtk_window_set_title(GTK_WINDOW(window),title);   gtk_container_set_border_width(GTK_CONTAINER(window),10);   g_signal_connect(G_OBJECT(window),"destroy",   G_CALLBACK(gtk_main_quit),NULL);   box = gtk_vbox_new(FALSE,0);   gtk_container_add(GTK_CONTAINER(window),box);   frame = gtk_frame_new("请选择一种颜色:");   gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_ETCHED_OUT);   gtk_box_pack_start(GTK_BOX(box),frame,FALSE,FALSE,5);   box1 = gtk_hbox_new(FALSE,10);   gtk_container_set_border_width(GTK_CONTAINER(box1),10);   gtk_container_add(GTK_CONTAINER(frame),box1);   radio1 = gtk_radio_button_new_with_label(NULL,red);//红色   g_signal_connect(G_OBJECT(radio1),"released",         G_CALLBACK(on_radio_clicked),(gpointer)1);   gtk_box_pack_start(GTK_BOX(box1),radio1,FALSE,FALSE,5);//创建多选按钮组   group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio1));   radio2 = gtk_radio_button_new_with_label(group,green);//绿色   g_signal_connect(G_OBJECT(radio2),"released",         G_CALLBACK(on_radio_clicked),(gpointer)2);   gtk_box_pack_start(GTK_BOX(box1),radio2,FALSE,FALSE,5);   group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio2));   radio3 = gtk_radio_button_new_with_label(group,yellow);//黄色   g_signal_connect(G_OBJECT(radio3),"released",         G_CALLBACK(on_radio_clicked),(gpointer)3);   gtk_box_pack_start(GTK_BOX(box1),radio3,FALSE,FALSE,5);   group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio3));   radio4 = gtk_radio_button_new_with_label(group,blue);//蓝色   g_signal_connect(G_OBJECT(radio4),"released",         G_CALLBACK(on_radio_clicked),(gpointer)4);   gtk_box_pack_start(GTK_BOX(box1),radio4,FALSE,FALSE,5);   button1 = gtk_button_new_from_stock(GTK_STOCK_OK);   g_signal_connect(G_OBJECT(button1),"clicked",         G_CALLBACK(gtk_main_quit),NULL);   gtk_box_pack_start(GTK_BOX(box),button1,FALSE,FALSE,5);   gtk_widget_show_all(window);   gtk_main();   return FALSE ;}

10.控制条scrollbar

#include <gtk/gtk.h>GtkWidget *hscale, *vscale;void cb_pos_menu_select( GtkWidget *item, GtkPositionType pos ){/* 设置两个比例构件的比例值的显示位置 */   gtk_scale_set_value_pos (GTK_SCALE (hscale), pos);   gtk_scale_set_value_pos (GTK_SCALE (vscale), pos);}void cb_update_menu_select( GtkWidget *item, GtkUpdateType policy ){/* 设置两个比例构件的更新方式 */   gtk_range_set_update_policy (GTK_RANGE (hscale), policy);   gtk_range_set_update_policy (GTK_RANGE (vscale), policy);}void cb_digits_scale( GtkAdjustment *adj ){/* 设置 adj->value 圆整的小数位数 */   gtk_scale_set_digits (GTK_SCALE (hscale), (gint) adj->value);   gtk_scale_set_digits (GTK_SCALE (vscale), (gint) adj->value);}void cb_page_size( GtkAdjustment *get, GtkAdjustment *set ){/* 将示例调整对象的 page size 和 page increment size 设置* 为"Page Size"比例构件指定的值 */   set->page_size = get->value;   set->page_increment = get->value;/* 设置调整对象的值并使它引发一个 "changed" 信号,以重新配置所有* 已经连接到这个调整对象的构件。 */   gtk_adjustment_set_value (set, CLAMP (set->value,             set->lower, (set->upper - set->page_size)));}void cb_draw_value( GtkToggleButton *button ){/* 根据复选按钮的状态设置在比例构件上是否显示比例值 */   gtk_scale_set_draw_value (GTK_SCALE (hscale), button->active);   gtk_scale_set_draw_value (GTK_SCALE (vscale), button->active);}/* 方便的函数 */GtkWidget *make_menu_item (gchar *name, GCallback callback, gpointer data){   GtkWidget *item;   item = gtk_menu_item_new_with_label (name);   g_signal_connect (G_OBJECT (item), "activate", callback, data);   gtk_widget_show (item);   return item;}void scale_set_default_values( GtkScale *scale ){   gtk_range_set_update_policy (GTK_RANGE (scale),   GTK_UPDATE_CONTINUOUS);   gtk_scale_set_digits (scale, 1);   gtk_scale_set_value_pos (scale, GTK_POS_TOP);   gtk_scale_set_draw_value (scale, TRUE);}/* 创建示例窗口 */void create_range_controls( void ){   GtkWidget *window;   GtkWidget *box1, *box2, *box3;   GtkWidget *button;   GtkWidget *scrollbar;   GtkWidget *separator;   GtkWidget *opt, *menu, *item;   GtkWidget *label;   GtkWidget *scale;   GtkObject *adj1, *adj2;/* 标准的创建窗口代码 */   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);   g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);   gtk_window_set_title (GTK_WINDOW (window), "RT's range controls");   box1 = gtk_vbox_new (FALSE, 0);   gtk_container_add (GTK_CONTAINER (window), box1);   gtk_widget_show (box1);   box2 = gtk_hbox_new (FALSE, 10);   gtk_container_set_border_width (GTK_CONTAINER (box2), 10);   gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);   gtk_widget_show (box2);/* value, lower, upper, step_increment, page_increment, page_size *//* 注意,page_size 值只对滚动条构件有区别,并且,你实际上能取得的最高值* 是(upper - page_size)。 */   adj1 = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);   vscale = gtk_vscale_new (GTK_ADJUSTMENT (adj1));   scale_set_default_values (GTK_SCALE (vscale));   gtk_box_pack_start (GTK_BOX (box2), vscale, TRUE, TRUE, 0);   gtk_widget_show (vscale);   box3 = gtk_vbox_new (FALSE, 10);   gtk_box_pack_start (GTK_BOX (box2), box3, TRUE, TRUE, 0);   gtk_widget_show (box3);/* 重新使用同一个调整对象 */   hscale = gtk_hscale_new (GTK_ADJUSTMENT (adj1));   gtk_widget_set_size_request (GTK_WIDGET (hscale), 200, -1);   scale_set_default_values (GTK_SCALE (hscale));   gtk_box_pack_start (GTK_BOX (box3), hscale, TRUE, TRUE, 0);   gtk_widget_show (hscale);/* 再次重用同一个调整对象 */   scrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (adj1));/* 注意,这导致当滚动条移动时,比例构件总是连续更新 */   gtk_range_set_update_policy (GTK_RANGE (scrollbar),   GTK_UPDATE_CONTINUOUS);   gtk_box_pack_start (GTK_BOX (box3), scrollbar, TRUE, TRUE, 0);   gtk_widget_show (scrollbar);   box2 = gtk_hbox_new (FALSE, 10);   gtk_container_set_border_width (GTK_CONTAINER (box2), 10);   gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);   gtk_widget_show (box2);/* 用一个复选按钮控制是否显示比例构件的值 */   button = gtk_check_button_new_with_label("Display value on scale widgets");   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);   g_signal_connect (G_OBJECT (button), "toggled",                     G_CALLBACK (cb_draw_value), NULL);   gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);   gtk_widget_show (button);   box2 = gtk_hbox_new (FALSE, 10);   gtk_container_set_border_width (GTK_CONTAINER (box2), 10);/* 用一个选项菜单以改变显示值的位置 */   label = gtk_label_new ("Scale Value Position:");   gtk_box_pack_start (GTK_BOX (box2), label, FALSE, FALSE, 0);   gtk_widget_show (label);   opt = gtk_option_menu_new ();   menu = gtk_menu_new ();   item = make_menu_item ("Top", G_CALLBACK (cb_pos_menu_select),                          GINT_TO_POINTER (GTK_POS_TOP));   gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);   item = make_menu_item ("Bottom", G_CALLBACK (cb_pos_menu_select),                          GINT_TO_POINTER (GTK_POS_BOTTOM));   gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);   item = make_menu_item ("Left", G_CALLBACK (cb_pos_menu_select),                           GINT_TO_POINTER (GTK_POS_LEFT));   gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);   item = make_menu_item ("Right", G_CALLBACK (cb_pos_menu_select),                           GINT_TO_POINTER (GTK_POS_RIGHT));   gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);   gtk_option_menu_set_menu (GTK_OPTION_MENU (opt), menu);   gtk_box_pack_start (GTK_BOX (box2), opt, TRUE, TRUE, 0);   gtk_widget_show (opt);   gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);   gtk_widget_show (box2);   box2 = gtk_hbox_new (FALSE, 10);   gtk_container_set_border_width (GTK_CONTAINER (box2), 10);/* 另一个选项菜单,这里是用于设置比例构件的更新方式 */   label = gtk_label_new ("Scale Update Policy:");   gtk_box_pack_start (GTK_BOX (box2), label, FALSE, FALSE, 0);   gtk_widget_show (label);   opt = gtk_option_menu_new ();   menu = gtk_menu_new ();   item = make_menu_item ("Continuous", G_CALLBACK (cb_update_menu_select),                           GINT_TO_POINTER (GTK_UPDATE_CONTINUOUS));   gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);   item = make_menu_item ("Discontinuous", G_CALLBACK (cb_update_menu_select),                          GINT_TO_POINTER (GTK_UPDATE_DISCONTINUOUS));   gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);   item = make_menu_item ("Delayed", G_CALLBACK (cb_update_menu_select),                          GINT_TO_POINTER (GTK_UPDATE_DELAYED));   gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);   gtk_option_menu_set_menu (GTK_OPTION_MENU (opt), menu);   gtk_box_pack_start (GTK_BOX (box2), opt, TRUE, TRUE, 0);   gtk_widget_show (opt);   gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);   gtk_widget_show (box2);   box2 = gtk_hbox_new (FALSE, 10);   gtk_container_set_border_width (GTK_CONTAINER (box2), 10);/* 一个水平比例构件,用于调整示例比例构件的显示小数位数。 */   label = gtk_label_new ("Scale Digits:");   gtk_box_pack_start (GTK_BOX (box2), label, FALSE, FALSE, 0);   gtk_widget_show (label);   adj2 = gtk_adjustment_new (1.0, 0.0, 5.0, 1.0, 1.0, 0.0);   g_signal_connect (G_OBJECT (adj2), "value_changed",                      G_CALLBACK (cb_digits_scale), NULL);   scale = gtk_hscale_new (GTK_ADJUSTMENT (adj2));   gtk_scale_set_digits (GTK_SCALE (scale), 0);   gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);   gtk_widget_show (scale);   gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);   gtk_widget_show (box2);   box2 = gtk_hbox_new (FALSE, 10);   gtk_container_set_border_width (GTK_CONTAINER (box2), 10);/* 以及,最后一个水平比例构件用于调整滚动条的 page size。 */   label = gtk_label_new ("Scrollbar Page Size:");   gtk_box_pack_start (GTK_BOX (box2), label, FALSE, FALSE, 0);   gtk_widget_show (label);   adj2 = gtk_adjustment_new (1.0, 1.0, 101.0, 1.0, 1.0, 0.0);   g_signal_connect (G_OBJECT (adj2), "value_changed",                     G_CALLBACK (cb_page_size), adj1);   scale = gtk_hscale_new (GTK_ADJUSTMENT (adj2));   gtk_scale_set_digits (GTK_SCALE (scale), 0);   gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);   gtk_widget_show (scale);   gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);   gtk_widget_show (box2);   separator = gtk_hseparator_new ();   gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);   gtk_widget_show (separator);   box2 = gtk_vbox_new (FALSE, 10);   gtk_container_set_border_width (GTK_CONTAINER (box2), 10);   gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);   gtk_widget_show (box2);   button = gtk_button_new_with_label ("Quit");   g_signal_connect_swapped (G_OBJECT (button), "clicked",                             G_CALLBACK (gtk_main_quit), NULL);   gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);                        GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);   gtk_widget_grab_default (button);   gtk_widget_show (button);   gtk_widget_show (window);}int main( int argc, char *argv[] ){   gtk_init (&argc, &argv);   create_range_controls ();   gtk_main ();   return 0;}

11.箭头按钮create\_arrow\_button

#include <gtk/gtk.h>/* 用指定的参数创建一个箭头构件并将它组装到按钮中 */GtkWidget *create_arrow_button( GtkArrowType arrow_type, GtkShadowType shadow_type ){   GtkWidget *button;   GtkWidget *arrow;   button = gtk_button_new ();   arrow = gtk_arrow_new (arrow_type, shadow_type);   gtk_container_add (GTK_CONTAINER (button), arrow);   gtk_widget_show (button);   gtk_widget_show (arrow);   return button;}int main( int argc, char *argv[] ){/* GtkWidget 是构件的存储类型 */   GtkWidget *window;   GtkWidget *button;   GtkWidget *box;/* 初始化 */   gtk_init (&argc, &argv);/* 创建一个新窗口 */   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);   gtk_window_set_title (GTK_WINDOW (window), "Arrow Buttons");/* 对所有的窗口都这样做是一个好主意 */   g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);/* 设置窗口的边框的宽度 */   gtk_container_set_border_width (GTK_CONTAINER (window), 10);/* 建一个组装盒以容纳箭头/按钮 */   box = gtk_hbox_new (FALSE, 0);   gtk_container_set_border_width (GTK_CONTAINER (box), 2);   gtk_container_add (GTK_CONTAINER (window), box);/* 组装、显示所有的构件 */   gtk_widget_show (box);   button = create_arrow_button (GTK_ARROW_UP, GTK_SHADOW_IN);   gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 3);   button = create_arrow_button (GTK_ARROW_DOWN, GTK_SHADOW_OUT);   gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 3);   button = create_arrow_button (GTK_ARROW_LEFT, GTK_SHADOW_ETCHED_IN);   gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 3);   button = create_arrow_button (GTK_ARROW_RIGHT, GTK_SHADOW_ETCHED_OUT);   gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 3);   gtk_widget_show (window);/* 进入主循环,等待用户的动作 */   gtk_main ();   return 0;}

12.标签label

#include <gtk/gtk.h>int main( int argc, char *argv[] ){   static GtkWidget *window = NULL;   GtkWidget *hbox;   GtkWidget *vbox;   GtkWidget *frame;   GtkWidget *label;/* 初始化 */   gtk_init (&argc, &argv);    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);   g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);   gtk_window_set_title (GTK_WINDOW (window), "Label");    vbox = gtk_vbox_new (FALSE, 5);   hbox = gtk_hbox_new (FALSE, 5);    gtk_container_add (GTK_CONTAINER (window), hbox);   gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);    gtk_container_set_border_width (GTK_CONTAINER (window), 5);    frame = gtk_frame_new ("Normal Label");   label = gtk_label_new ("This is a Normal label");   gtk_container_add (GTK_CONTAINER (frame), label);   gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);    frame = gtk_frame_new ("Multi-line Label");   label = gtk_label_new ("This is a Multi-line label.\nSecond line\n" \                          "Third line");   gtk_container_add (GTK_CONTAINER (frame), label);   gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);    frame = gtk_frame_new ("Left Justified Label");   label = gtk_label_new ("This is a Left-Justified\n" \                          "Multi-line label.\nThird line");   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);   gtk_container_add (GTK_CONTAINER (frame), label);   gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);    frame = gtk_frame_new ("Right Justified Label");   label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\n" \                          "Fourth line, (j/k)");   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);   gtk_container_add (GTK_CONTAINER (frame), label);   gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);    vbox = gtk_vbox_new (FALSE, 5);   gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);   frame = gtk_frame_new ("Line wrapped label");   label = gtk_label_new ("This is an example of a line-wrapped label. It " \                           /* 用一段较长的空白字符来测试空白的自动排列 */                          "should not be taking up the entire" \                          "width allocated to it, but automatically " \                          "wraps the words to fit. " \                          "The time has come, for all good men, to come to " \                          "the aid of their party. " \                          "The sixth sheik's six sheep's sick.\n" \                          "It supports multiple paragraphs correctly, " \                          "and correctly adds "\                          "many extra spaces. ");   gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);   gtk_container_add (GTK_CONTAINER (frame), label);   gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);    frame = gtk_frame_new ("Filled, wrapped label");   label = gtk_label_new ("This is an example of a line-wrapped, filled label. " \                          "It should be taking "\                          "up the entire width allocated to it. " \                          "Here is a sentence to prove "\                          "my point. Here is another sentence. "\                          "Here comes the sun, do de do de do.\n"\                          " This is a new paragraph.\n"\                          " This is another newer, longer, better " \                          "paragraph. It is coming to an end, "\                          "unfortunately.");   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);   gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);   gtk_container_add (GTK_CONTAINER (frame), label);   gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);    frame = gtk_frame_new ("Underlined label");   label = gtk_label_new ("This label is underlined!\n"                          "This one is underlined in quite a funky fashion");   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);   gtk_label_set_pattern (GTK_LABEL (label),                          "_________________________ _ _________ _ ________ _______ ___");   gtk_container_add (GTK_CONTAINER (frame), label);   gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);    gtk_widget_show_all (window);    gtk_main ();   return 0;}

12.子窗口:触发事件打开窗口

#include <gtk/gtk.h> gint delete_event( GtkWidget *widget, GdkEvent  *event, gpointer   data ){    g_print ("delete event occurred\n");    /* 改 TRUE 为 FALSE 程序会关闭。*/    return FALSE;} /* 另一个回调函数 */void destroy( GtkWidget *widget, gpointer   data ){    gtk_main_quit ();}void hello( GtkWidget *widget, gpointer   data ){    g_print ("Hello World\n");}void New_window( GtkWidget *widget, gpointer   data ){    GtkWidget *window;    GtkWidget *button;     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);    g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL);    g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy), NULL);    gtk_container_set_border_width (GTK_CONTAINER (window), 10);        button = gtk_button_new_with_label ("Hello world !");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (hello), "1");    gtk_container_add (GTK_CONTAINER (window), button);     gtk_widget_show (button);    gtk_widget_show (window);     g_print ("Hello World\n");//temp(data );}int main( int   argc, char *argv[] ){    GtkWidget *window;    GtkWidget *button;        gtk_init (&argc, &argv);        /* 创建一个新窗口 */    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);    g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL);    g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy), NULL);    gtk_container_set_border_width (GTK_CONTAINER (window), 10);        button = gtk_button_new_with_label ("Open hello world");    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (New_window), "1");    gtk_container_add (GTK_CONTAINER (window), button);     gtk_widget_show (button);    gtk_widget_show (window);     gtk_main ();        return 0;}

13.进度条progressbar

#include <gtk/gtk.h> typedef struct _ProgressData {   GtkWidget *window;   GtkWidget *pbar;   int timer;   gboolean activity_mode;} ProgressData; /* 更新进度条,这样就能够看到进度条的移动 */gint progress_timeout( gpointer data ){   ProgressData *pdata = (ProgressData *)data;   gdouble new_val;   if (pdata->activity_mode)   {       gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));   } else {/* 使用在调整对象中设置的取值范围计算进度条的值 */       new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;       if (new_val > 1.0)          new_val = 0.0;/* 设置进度条的新值 */       gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);   }/* 这是一个 timeout 函数,返回 TRUE,这样它就能够继续被调用 */   return TRUE;}/* 回调函数,切换在进度条你的滑槽上的文本显示 */void toggle_show_text( GtkWidget *widget, ProgressData *pdata ){   const gchar *text;   text = gtk_progress_bar_get_text (GTK_PROGRESS_BAR (pdata->pbar));   if (text && *text)      gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar), "");   else      gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar), "some text");}/* 回调函数,切换进度条的活动模式 */void toggle_activity_mode( GtkWidget *widget, ProgressData *pdata ){   pdata->activity_mode = !pdata->activity_mode;   if (pdata->activity_mode)       gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));   else       gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), 0.0);}/* 回调函数,切换进度条的移动方向 */void toggle_orientation( GtkWidget *widget, ProgressData *pdata ){ switch (gtk_progress_bar_get_orientation (GTK_PROGRESS_BAR (pdata->pbar))) {   case GTK_PROGRESS_LEFT_TO_RIGHT:      gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (pdata->pbar),                                     GTK_PROGRESS_RIGHT_TO_LEFT);      break;   case GTK_PROGRESS_RIGHT_TO_LEFT:      gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (pdata->pbar),                                     GTK_PROGRESS_LEFT_TO_RIGHT);      break;   default:; // 什么也不做 }}/* 清除分配的内存,删除定时器(timer) */void destroy_progress( GtkWidget *widget, ProgressData *pdata){   gtk_timeout_remove (pdata->timer);   pdata->timer = 0;   pdata->window = NULL;   g_free (pdata);   gtk_main_quit ();}int main( int argc, char *argv[]){   ProgressData *pdata;   GtkWidget *align;   GtkWidget *separator;   GtkWidget *table;   GtkWidget *button;   GtkWidget *check;   GtkWidget *vbox;    gtk_init (&argc, &argv);/* 为传递到回调函数中的数据分配内存 */   pdata = g_malloc (sizeof (ProgressData));   pdata->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);   gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);   g_signal_connect (G_OBJECT (pdata->window), "destroy",                     G_CALLBACK (destroy_progress), pdata);   gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");   gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 10);    vbox = gtk_vbox_new (FALSE, 5);   gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);   gtk_container_add (GTK_CONTAINER (pdata->window), vbox);   gtk_widget_show (vbox);/* 创建一个居中对齐的对象 */   align = gtk_alignment_new (0.5, 0.5, 0, 0);   gtk_box_pack_start (GTK_BOX (vbox), align, FALSE, FALSE, 5);   gtk_widget_show (align);/* 创建进度条 */   pdata->pbar = gtk_progress_bar_new ();   gtk_container_add (GTK_CONTAINER (align), pdata->pbar);   gtk_widget_show (pdata->pbar); /* 加一个定时器(timer),以更新进度条的值 */   pdata->timer = gtk_timeout_add (200, progress_timeout, pdata);    separator = gtk_hseparator_new ();   gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, FALSE, 0);   gtk_widget_show (separator);/* 行数、列数、同质性(homogeneous) */   table = gtk_table_new (3, 2, FALSE);   gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);   gtk_widget_show (table);/* 添加一个复选按钮,以选择是否显示在滑槽里的文本 */   check = gtk_check_button_new_with_label ("Show text");   gtk_table_attach (GTK_TABLE (table), check, 0, 1, 0, 1,                     GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 5, 5);   g_signal_connect (G_OBJECT (check), "clicked", G_CALLBACK (toggle_show_text), pdata);   gtk_widget_show (check);/* 添加一个复选按钮,切换活动状态 */   check = gtk_check_button_new_with_label ("Activity mode");   gtk_table_attach (GTK_TABLE (table), check, 0, 1, 1, 2,                     GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 5, 5);   g_signal_connect (G_OBJECT (check), "clicked", G_CALLBACK (toggle_activity_mode), pdata);   gtk_widget_show (check);/* 添加一个复选按钮,切换移动方向 */   check = gtk_check_button_new_with_label ("Right to Left");   gtk_table_attach (GTK_TABLE (table), check, 0, 1, 2, 3,                      GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 5, 5);   g_signal_connect (G_OBJECT (check), "clicked",                     G_CALLBACK (toggle_orientation), pdata);   gtk_widget_show (check);/* 添加一个按钮,用来退出应用程序 */   button = gtk_button_new_with_label ("close");   g_signal_connect_swapped (G_OBJECT (button), "clicked",                             G_CALLBACK (gtk_widget_destroy), pdata->window);   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);/* 将按钮设置为能缺省的构件 */    GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);/* 将缺省焦点设置到这个按钮上,使之成为缺省按钮,只要按回车键* 就相当于点击了这个按钮 *///译者注: 能缺省的构件在获取焦点后成为缺省构件,用户按方向键等可以切换焦点。   gtk_widget_grab_default (button);   gtk_widget_show (button);   gtk_widget_show (pdata->window);   gtk_main ();   return 0;}

14.窗口标尺gtk\_hruler\_new

#include <gtk/gtk.h>#define EVENT_METHOD(i, x) GTK_WIDGET_GET_CLASS(i)->x#define XSIZE 600#define YSIZE 400/* 当点击"close"按钮时,退出应用程序 */gint close_application( GtkWidget *widget, GdkEvent *event, gpointer data ){   gtk_main_quit ();   return FALSE;}/* 主函数 */int main( int argc, char *argv[] ) {   GtkWidget *window, *table, *area, *hrule, *vrule;/* 初始化,创建主窗口 */   gtk_init (&argc, &argv);   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);   g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (close_application), NULL);   gtk_container_set_border_width (GTK_CONTAINER (window), 10);/* 创建一个组装表,绘图区和标尺放在里面 */   table = gtk_table_new (3, 2, FALSE);   gtk_container_add (GTK_CONTAINER (window), table);   area = gtk_drawing_area_new ();   gtk_widget_set_size_request (GTK_WIDGET (area), XSIZE, YSIZE);   gtk_table_attach (GTK_TABLE (table), area, 1, 2, 1, 2,                     GTK_EXPAND|GTK_FILL, GTK_FILL, 0, 0);   gtk_widget_set_events (area, GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK);/* 水平标尺放在顶部。鼠标移动穿过绘图区时,一个* motion_notify_event 被传递给标尺的相应的事件处理函数 */   hrule = gtk_hruler_new ();   gtk_ruler_set_metric (GTK_RULER (hrule), GTK_PIXELS);   gtk_ruler_set_range (GTK_RULER (hrule), 0, 50, 0, 20);   g_signal_connect_swapped (G_OBJECT (area), "motion_notify_event",                          G_CALLBACK (EVENT_METHOD (hrule, motion_notify_event)), hrule);   gtk_table_attach (GTK_TABLE (table), hrule, 1, 2, 0, 1,                     GTK_EXPAND|GTK_SHRINK|GTK_FILL, GTK_FILL, 0, 0);/* 垂直标尺放在左边。当鼠标移动穿过绘图区时,一个* motion_notify_event 被传递到标尺相应的事件处理函数中 */   vrule = gtk_vruler_new ();   gtk_ruler_set_metric (GTK_RULER (vrule), GTK_PIXELS);   gtk_ruler_set_range (GTK_RULER (vrule), 0, YSIZE, 10, YSIZE );   g_signal_connect_swapped (G_OBJECT (area), "motion_notify_event",                     G_CALLBACK (EVENT_METHOD (vrule, motion_notify_event)), vrule);   gtk_table_attach (GTK_TABLE (table), vrule, 0, 1, 1, 2,                     GTK_FILL, GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0);/* 现在显示所有的构件 */   gtk_widget_show (area);   gtk_widget_show (hrule);   gtk_widget_show (vrule);   gtk_widget_show (table);   gtk_widget_show (window);   gtk_main ();   return 0;}

15.状态栏(条)gtk\_statusbar\_new

#include <stdlib.h>#include <gtk/gtk.h>#include <glib.h>GtkWidget *status_bar;void push_item( GtkWidget *widget, gpointer data ){   static int count = 1;   char buff[20];   g_snprintf (buff, 20, "Item %d", count++);   gtk_statusbar_push (GTK_STATUSBAR (status_bar), GPOINTER_TO_INT (data), buff);   return;}void pop_item( GtkWidget *widget, gpointer data ){   gtk_statusbar_pop (GTK_STATUSBAR (status_bar), GPOINTER_TO_INT (data));   return;}int main( int argc, char *argv[] ){   GtkWidget *window;   GtkWidget *vbox;   GtkWidget *button;   gint context_id;    gtk_init (&argc, &argv);/* 创建新窗口 */   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);   gtk_widget_set_size_request (GTK_WIDGET (window), 200, 100);   gtk_window_set_title (GTK_WINDOW (window), "GTK Statusbar Example");   g_signal_connect (G_OBJECT (window), "delete_event",                     G_CALLBACK (exit), NULL);    vbox = gtk_vbox_new (FALSE, 1);   gtk_container_add (GTK_CONTAINER (window), vbox);   gtk_widget_show (vbox);    status_bar = gtk_statusbar_new ();   gtk_box_pack_start (GTK_BOX (vbox), status_bar, TRUE, TRUE, 0);   gtk_widget_show (status_bar);    context_id = gtk_statusbar_get_context_id( GTK_STATUSBAR (status_bar), "Statusbar example");    button = gtk_button_new_with_label ("push item");   g_signal_connect (G_OBJECT (button), "clicked",                     G_CALLBACK (push_item), GINT_TO_POINTER (context_id));   gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 2);   gtk_widget_show (button);    button = gtk_button_new_with_label ("pop last item");   g_signal_connect (G_OBJECT (button), "clicked",                     G_CALLBACK (pop_item), GINT_TO_POINTER (context_id));   gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 2);   gtk_widget_show (button); /* 将窗口最后显示,让整个窗口一次性出现在屏幕上. */   gtk_widget_show (window);   gtk_main ();   return 0;}

另一个例子

/* 状态栏 status.c */#include <gtk/gtk.h>static GtkWidget *statusbar;gint i = 0 ;void on_push_clicked (GtkButton* button,gpointer data){   char message[1024];   i++ ;   sprintf(message,"这是输入的第 %d 条消息.",i);   gtk_statusbar_push(GTK_STATUSBAR(statusbar),i,message);}void on_pop_clicked (GtkButton* button,gpointer data){   if (i<0) return ;   gtk_statusbar_pop(GTK_STATUSBAR(statusbar),i);   i--;}void on_popped (GtkStatusbar* statusbar,guint id,const gchar*text){   if(!statusbar->messages)   i = 0;}int main ( int argc , char* argv[]){   GtkWidget *window;   GtkWidget *vbox,*hbox;   GtkWidget *button;    gtk_init(&argc,&argv);    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);   g_signal_connect(G_OBJECT(window),"delete_event",      G_CALLBACK(gtk_main_quit),NULL);   gtk_window_set_title(GTK_WINDOW(window),"状态栏");  // gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);   gtk_container_set_border_width(GTK_CONTAINER(window),20);    vbox = gtk_vbox_new(FALSE,0);   gtk_container_add(GTK_CONTAINER(window),vbox);    statusbar = gtk_statusbar_new();   g_signal_connect(G_OBJECT(statusbar),"text-popped",      G_CALLBACK(on_popped),NULL);    gtk_box_pack_start(GTK_BOX(vbox),statusbar,FALSE,FALSE,5);    hbox = gtk_hbox_new(FALSE,0);   gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,5);    button = gtk_button_new_with_label("推入");   g_signal_connect(G_OBJECT(button),"clicked",      G_CALLBACK(on_push_clicked),NULL);    gtk_box_pack_start(GTK_BOX(hbox),button,TRUE,TRUE,5);   button = gtk_button_new_with_label("弹出");   g_signal_connect(G_OBJECT(button),"clicked",      G_CALLBACK(on_pop_clicked),NULL);    gtk_box_pack_start(GTK_BOX(hbox),button,TRUE,TRUE,5);   gtk_widget_show_all(window);   gtk_main();   return FALSE;}

16.文本输入gtk\_entry\_new:可见/不可见,可输入/不可输入

#include <stdio.h>#include <stdlib.h>#include <gtk/gtk.h>void enter_callback( GtkWidget *widget, GtkWidget *entry ){   const gchar *entry_text;   entry_text = gtk_entry_get_text (GTK_ENTRY (entry));   printf("Entry contents: %s\n", entry_text);}void entry_toggle_editable( GtkWidget *checkbutton, GtkWidget *entry ){   gtk_editable_set_editable (GTK_EDITABLE (entry),                              GTK_TOGGLE_BUTTON (checkbutton)->active);}void entry_toggle_visibility( GtkWidget *checkbutton, GtkWidget *entry ){   gtk_entry_set_visibility (GTK_ENTRY (entry),                             GTK_TOGGLE_BUTTON (checkbutton)->active);}int main( int argc, char *argv[] ){   GtkWidget *window;   GtkWidget *vbox, *hbox;   GtkWidget *entry;   GtkWidget *button;   GtkWidget *check;   gint tmp_pos;    gtk_init (&argc, &argv);/* 创建一个新窗口 */   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);   gtk_widget_set_size_request (GTK_WIDGET (window), 200, 100);   gtk_window_set_title (GTK_WINDOW (window), "GTK Entry");   //g_signal_connect (G_OBJECT (window), "destroy",   //                  G_CALLBACK (gtk_main_quit), NULL);   g_signal_connect (G_OBJECT (window), "delete_event",                     G_CALLBACK (exit), NULL);   g_signal_connect_swapped (G_OBJECT (window), "delete_event",                             G_CALLBACK (gtk_widget_destroy), window);    vbox = gtk_vbox_new (FALSE, 0);   gtk_container_add (GTK_CONTAINER (window), vbox);   gtk_widget_show (vbox);    entry = gtk_entry_new ();   gtk_entry_set_max_length (GTK_ENTRY (entry), 50);   g_signal_connect (G_OBJECT (entry), "activate", G_CALLBACK (enter_callback), entry);    gtk_entry_set_text (GTK_ENTRY (entry), "hello");    tmp_pos = GTK_ENTRY (entry)->text_length;   gtk_editable_insert_text (GTK_EDITABLE (entry), " world", -1, &tmp_pos);   gtk_editable_select_region (GTK_EDITABLE (entry), 0, GTK_ENTRY (entry)->text_length);   gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);   gtk_widget_show (entry);    hbox = gtk_hbox_new (FALSE, 0);   gtk_container_add (GTK_CONTAINER (vbox), hbox);   gtk_widget_show (hbox);    check = gtk_check_button_new_with_label ("Editable");   gtk_box_pack_start (GTK_BOX (hbox), check, TRUE, TRUE, 0);   g_signal_connect (G_OBJECT (check), "toggled",                     G_CALLBACK (entry_toggle_editable), entry);   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);   gtk_widget_show (check);    check = gtk_check_button_new_with_label ("Visible");   gtk_box_pack_start (GTK_BOX (hbox), check, TRUE, TRUE, 0);   g_signal_connect (G_OBJECT (check), "toggled",                     G_CALLBACK (entry_toggle_visibility), entry);   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);   gtk_widget_show (check);    button = gtk_button_new_from_stock (GTK_STOCK_CLOSE);   g_signal_connect_swapped (G_OBJECT (button), "clicked",                             G_CALLBACK (gtk_widget_destroy), window);   gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);                       GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);   gtk_widget_grab_default (button);   gtk_widget_show (button);    gtk_widget_show (window);   gtk_main();   return 0;}

规定最大长度的gtk\_entry\_new\_with\_max_length

#include<gtk/gtk.h>#include<stdio.h>#include<string.h>#include<stdlib.h>GtkWidget *_nx, *_nz, *_dx, *_dz, *_npd, *_mm;GtkWidget *_vel, *_epsilu, *_deta, *_shot, *_snap;GtkWidget *_favg, *_fs, *_ds, *_ns, *_zs; gint nx, nz, npd, mm, fs, ds, ns, zs;gfloat dx, dz, favg; void debug(GtkWidget *window,gpointer data){      gtk_main_quit();} void write_txt(GtkWidget *widget,gpointer data){     const char*str_nx=gtk_entry_get_text(GTK_ENTRY((GtkWidget *)_nx));    const char*str_nz=gtk_entry_get_text(GTK_ENTRY((GtkWidget *)_nz));    const char*str_dx=gtk_entry_get_text(GTK_ENTRY((GtkWidget *)_dx));    const char*str_dz=gtk_entry_get_text(GTK_ENTRY((GtkWidget *)_dz));    const char*str_npd=gtk_entry_get_text(GTK_ENTRY((GtkWidget *)_npd));    const char*str_mm=gtk_entry_get_text(GTK_ENTRY((GtkWidget *)_mm));    const char*str_vel=gtk_entry_get_text(GTK_ENTRY((GtkWidget *)_vel));    const char*str_epsilu=gtk_entry_get_text(GTK_ENTRY((GtkWidget *)_epsilu));    const char*str_deta=gtk_entry_get_text(GTK_ENTRY((GtkWidget *)_deta));    const char*str_favg=gtk_entry_get_text(GTK_ENTRY((GtkWidget *)_favg));    const char*str_fs=gtk_entry_get_text(GTK_ENTRY((GtkWidget *)_fs));    const char*str_ns=gtk_entry_get_text(GTK_ENTRY((GtkWidget *)_ns));    const char*str_ds=gtk_entry_get_text(GTK_ENTRY((GtkWidget *)_ds));    const char*str_zs=gtk_entry_get_text(GTK_ENTRY((GtkWidget *)_zs));    const char*str_shot=gtk_entry_get_text(GTK_ENTRY((GtkWidget *)_shot));    const char*str_snap=gtk_entry_get_text(GTK_ENTRY((GtkWidget *)_snap));      nx=strtod(str_nx,NULL);    nz=strtod(str_nz,NULL);    dx=strtod(str_dx,NULL);    dz=strtod(str_dz,NULL);    npd=strtod(str_npd,NULL);    mm=strtod(str_mm,NULL);    favg=strtod(str_favg,NULL);    fs=strtod(str_fs,NULL);    ns=strtod(str_ns,NULL);    ds=strtod(str_ds,NULL);    zs=strtod(str_zs,NULL);}int main(int argc,char* argv[]){     GtkWidget *window;    GtkWidget *button;     GtkWidget *label;    GtkWidget *table;       gtk_init(&argc,&argv);           window=gtk_window_new(GTK_WINDOW_TOPLEVEL);    gtk_window_set_title(GTK_WINDOW(window),"RT's VTI model");    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);    //gtk_window_set_default_size(GTK_WINDOW(window),400,400);    g_signal_connect(GTK_OBJECT(window),"delete_event",GTK_SIGNAL_FUNC(debug),NULL);         table=gtk_table_new(13,6,FALSE);    gtk_container_add(GTK_CONTAINER(window),table);    label=gtk_label_new("Model parameter:");    gtk_table_attach_defaults(GTK_TABLE(table),label,1,2,0,1); /***   nx  ***/    label=gtk_label_new("nx=");    gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,1,2);    _nx=gtk_entry_new_with_max_length(10);    gtk_entry_set_text (GTK_ENTRY (_nx), "100");    gtk_table_attach_defaults(GTK_TABLE(table),_nx,1,2,1,2);/***   dx  ***/    label=gtk_label_new("dx=");    gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,1,2);    _dx=gtk_entry_new_with_max_length(10);    gtk_entry_set_text (GTK_ENTRY (_dx), "5");    gtk_table_attach_defaults(GTK_TABLE(table),_dx,3,4,1,2);/***   npd  ***/    label=gtk_label_new("npd=");    gtk_table_attach_defaults(GTK_TABLE(table),label,4,5,1,2);    _npd=gtk_entry_new_with_max_length(10);    gtk_entry_set_text (GTK_ENTRY (_npd), "20");    gtk_table_attach_defaults(GTK_TABLE(table),_npd,5,6,1,2);/***   nz  ***/    label=gtk_label_new("nz=");    gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,2,3);    _nz=gtk_entry_new_with_max_length(10);    gtk_entry_set_text (GTK_ENTRY (_nz), "100");    gtk_table_attach_defaults(GTK_TABLE(table),_nz,1,2,2,3);/***   dz  ***/    label=gtk_label_new("dz=");    gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,2,3);    _dz=gtk_entry_new_with_max_length(10);    gtk_entry_set_text (GTK_ENTRY (_dz), "5");    gtk_table_attach_defaults(GTK_TABLE(table),_dz,3,4,2,3);/***   mm  ***/    label=gtk_label_new("mm=");    gtk_table_attach_defaults(GTK_TABLE(table),label,4,5,2,3);    _mm=gtk_entry_new_with_max_length(10);    gtk_entry_set_text (GTK_ENTRY (_mm), "4");    gtk_table_attach_defaults(GTK_TABLE(table),_mm,5,6,2,3);     label=gtk_label_new("Input Filename:");    gtk_table_attach_defaults(GTK_TABLE(table),label,1,2,3,4);/***   vel  ***/    label=gtk_label_new("vel:");    gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,4,5);    _vel=gtk_entry_new_with_max_length(10);    gtk_entry_set_text (GTK_ENTRY (_vel), "vel.dat");    gtk_table_attach_defaults(GTK_TABLE(table),_vel,1,4,4,5);/***   epsilu  ***/    label=gtk_label_new("epsilu:");    gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,5,6);    _epsilu=gtk_entry_new_with_max_length(10);    gtk_entry_set_text (GTK_ENTRY (_epsilu), "epsilu.dat");    gtk_table_attach_defaults(GTK_TABLE(table),_epsilu,1,4,5,6);/***   deta  ***/    label=gtk_label_new("deta:");    gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,6,7);    _deta=gtk_entry_new_with_max_length(10);    gtk_entry_set_text (GTK_ENTRY (_deta), "deta.dat");    gtk_table_attach_defaults(GTK_TABLE(table),_deta,1,4,6,7);     label=gtk_label_new("ShotParas:");    gtk_table_attach_defaults(GTK_TABLE(table),label,1,2,7,8);/***   ns  ***/    label=gtk_label_new("ns=");    gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,8,9);    _ns=gtk_entry_new_with_max_length(10);    gtk_entry_set_text (GTK_ENTRY (_ns), "1");    gtk_table_attach_defaults(GTK_TABLE(table),_ns,1,2,8,9);/***   favg  ***/    label=gtk_label_new("favg=");    gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,8,9);    _favg=gtk_entry_new_with_max_length(10);    gtk_entry_set_text (GTK_ENTRY (_favg), "20");    gtk_table_attach_defaults(GTK_TABLE(table),_favg,3,4,8,9);/***   fs  ***/    label=gtk_label_new("fs=");    gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,9,10);    _fs=gtk_entry_new_with_max_length(10);    gtk_entry_set_text (GTK_ENTRY (_fs), "1");    gtk_table_attach_defaults(GTK_TABLE(table),_fs,1,2,9,10);/***   ds  ***/    label=gtk_label_new("ds=");    gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,9,10);    _ds=gtk_entry_new_with_max_length(10);    gtk_entry_set_text (GTK_ENTRY (_ds), "0");    gtk_table_attach_defaults(GTK_TABLE(table),_ds,3,4,9,10);/***   zs  ***/    label=gtk_label_new("zs=");    gtk_table_attach_defaults(GTK_TABLE(table),label,4,5,9,10);    _zs=gtk_entry_new_with_max_length(10);    gtk_entry_set_text (GTK_ENTRY (_zs), "1");    gtk_table_attach_defaults(GTK_TABLE(table),_zs,5,6,9,10);      label=gtk_label_new("Output Filename:");    gtk_table_attach_defaults(GTK_TABLE(table),label,1,2,10,11);/***   shot  ***/    label=gtk_label_new("shot=");    gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,11,12);    _shot=gtk_entry_new_with_max_length(10);    gtk_entry_set_text (GTK_ENTRY (_shot), "shot.dat");    gtk_table_attach_defaults(GTK_TABLE(table),_shot,1,4,11,12);/***   snap  ***/    label=gtk_label_new("snap=");    gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,12,13);    _snap=gtk_entry_new_with_max_length(10);    gtk_entry_set_text (GTK_ENTRY (_snap), "snap.dat");    gtk_table_attach_defaults(GTK_TABLE(table),_snap,1,4,12,13);     label=gtk_label_new("Please ensure all parameters input accuratlly !");    gtk_table_attach_defaults(GTK_TABLE(table),label,0,10,13,14);/***   run button  ***/    button=gtk_button_new_with_label("RUN");    g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(write_txt),NULL);    gtk_table_attach_defaults(GTK_TABLE(table),button,5,6,12,13);     gtk_widget_show_all(window);    gtk_main();    return 0;}

输入文本执行一条命令

/* 命令工具 command.c */#include <gtk/gtk.h>static GtkWidget *entry;void on_button_clicked (GtkButton* button,gpointer data){   const gchar* command;   command = gtk_entry_get_text(GTK_ENTRY(entry));   system(command);}int main ( int argc , char* argv[]){   GtkWidget *window;   GtkWidget *hbox;   GtkWidget *label;   GtkWidget *button;    gtk_init(&argc,&argv);    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);   g_signal_connect(G_OBJECT(window),"delete_event",         G_CALLBACK(gtk_main_quit),NULL);   gtk_window_set_title(GTK_WINDOW(window),"命令窗口");   //gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);    hbox = gtk_hbox_new(FALSE,0);   gtk_container_add(GTK_CONTAINER(window),hbox);    label = gtk_label_new("输入命令:");   gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,5);    entry = gtk_entry_new();   gtk_box_pack_start(GTK_BOX(hbox),entry,TRUE,TRUE,5);    button = gtk_button_new_with_label("执行");   g_signal_connect(G_OBJECT(button),"clicked",         G_CALLBACK(on_button_clicked),NULL);   gtk_box_pack_start(GTK_BOX(hbox),button,FALSE,FALSE,5);    gtk_widget_show_all(window);   gtk_main();   return FALSE;}

17.文件选择:gtk\_file\_selection_new

#include <gtk/gtk.h>/* 获得文件名,并将它打印到控制台(console)上 */void file_ok_sel( GtkWidget *w, GtkFileSelection *fs ){   g_print ("Filename:%s\n", gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs)));}int main( int argc, char *argv[] ){   GtkWidget *filew;   gtk_init (&argc, &argv);/* 创建一个新的文件选择构件 */   filew = gtk_file_selection_new ("File selection");   g_signal_connect (G_OBJECT (filew), "destroy", G_CALLBACK (gtk_main_quit), NULL);/* 为 ok_button 按钮设置回调函数,连接到 file_ok_sel function 函数 */   g_signal_connect (G_OBJECT (GTK_FILE_SELECTION (filew)->ok_button), "clicked",                     G_CALLBACK (file_ok_sel), filew);/* 为 cancel_button 设置回调函数,销毁构件 */   g_signal_connect_swapped (G_OBJECT (GTK_FILE_SELECTION (filew)->cancel_button), "clicked",                             G_CALLBACK (gtk_widget_destroy), filew);/* 设置文件名,比如这个一个文件保存对话框,我们给了一个缺省文件名 */   gtk_file_selection_set_filename (GTK_FILE_SELECTION(filew), "penguin.png");   gtk_widget_show (filew);   gtk_main ();   return 0;}

给另一个例子,选择一个VTI介质模型参数

#include <gtk/gtk.h>#include <stdlib.h> GtkWidget *file,*_vel,*_deta,*_epsilu;  void file_OK( GtkWidget *w, gpointer *data ){    gtk_entry_set_text (GTK_ENTRY (data),                   gtk_file_selection_get_filename (GTK_FILE_SELECTION (file)));    gtk_widget_destroy (file);}void select_file(GtkWidget *w,gpointer *data){    file= gtk_file_selection_new ("File selection");     g_signal_connect (G_OBJECT (GTK_FILE_SELECTION (file)->ok_button), "clicked",                     G_CALLBACK (file_OK), data);    g_signal_connect_swapped (G_OBJECT (GTK_FILE_SELECTION (file)->cancel_button), "clicked",                             G_CALLBACK (gtk_widget_destroy), NULL);    gtk_widget_show (file);}/* 创建一个新的横向盒,它包含一个图像和一个标签,并返回这个盒。*/GtkWidget *xpm_label_box( gchar *xpm_filename, gchar *label_text ){   GtkWidget *box;   GtkWidget *label;   GtkWidget *image;/* 为图像和标签创建盒 */   box = gtk_hbox_new (FALSE, 0);   gtk_container_set_border_width (GTK_CONTAINER (box), 10);/* 创建一个图像 */   image = gtk_image_new_from_file (xpm_filename);/* 为按钮创建一个标签 */   label = gtk_label_new (label_text);/* 把图像和标签组装到盒子里 */   gtk_box_pack_start (GTK_BOX (box), image, TRUE, TRUE, 3);   gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 3);   gtk_widget_show (image);   gtk_widget_show (label);   return box;}int main( int argc, char *argv[] ){    GtkWidget *window;    GtkWidget *button;     GtkWidget *label;    GtkWidget *table;     GtkWidget *box;     gtk_init (&argc, &argv);     window=gtk_window_new(GTK_WINDOW_TOPLEVEL);    gtk_window_set_title(GTK_WINDOW(window),"RT's VTI model");    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);    g_signal_connect(GTK_OBJECT(window),"delete_event",GTK_SIGNAL_FUNC(gtk_main_quit),NULL);         table=gtk_table_new(3,8,TRUE);    gtk_container_add(GTK_CONTAINER(window),table);     label=gtk_label_new("Input Filename:");    gtk_table_attach_defaults(GTK_TABLE(table),label,0,2,0,1); /*******************  vel *******************/    label=gtk_label_new("vel:");    gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,1,2);    _vel=gtk_entry_new_with_max_length(100);    gtk_entry_set_text (GTK_ENTRY (_vel), "vel.dat");    gtk_table_attach_defaults(GTK_TABLE(table),_vel,1,7,1,2);    button=gtk_button_new();    box = xpm_label_box ("pic/dir2.jpg", NULL);    gtk_container_add (GTK_CONTAINER (button), box);    g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(select_file),_vel);    gtk_table_attach_defaults(GTK_TABLE(table),button,7,8,1,2); /*******************  epsilu *******************/    label=gtk_label_new("epsilu:");    gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,2,3);    _epsilu=gtk_entry_new_with_max_length(100);    gtk_entry_set_text (GTK_ENTRY (_epsilu), "epsilu.dat");    gtk_table_attach_defaults(GTK_TABLE(table),_epsilu,1,7,2,3);    //button=gtk_button_new_with_label("...");    button=gtk_button_new();    box = xpm_label_box ("pic/dir2.jpg", NULL);    gtk_container_add (GTK_CONTAINER (button), box);    g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(select_file),_epsilu);    gtk_table_attach_defaults(GTK_TABLE(table),button,7,8,2,3); /*******************  deta *******************/    label=gtk_label_new("deta:");    gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,3,4);    _deta=gtk_entry_new_with_max_length(100);    gtk_entry_set_text (GTK_ENTRY (_deta), "deta.dat");    gtk_table_attach_defaults(GTK_TABLE(table),_deta,1,7,3,4);    //button=gtk_button_new_with_label("...");    button=gtk_button_new();    box = xpm_label_box ("pic/dir2.jpg", NULL);    gtk_container_add (GTK_CONTAINER (button), box);    g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(select_file),_deta);    gtk_table_attach_defaults(GTK_TABLE(table),button,7,8,3,4);       gtk_widget_show_all(window);    gtk_main ();    return 0;}

18.事件盒子gtk\_event\_box_new

#include <stdlib.h>#include <gtk/gtk.h>int main( int argc, char *argv[] ){   GtkWidget *window;   GtkWidget *event_box;   GtkWidget *label;   gtk_init (&argc, &argv);   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);   gtk_window_set_title (GTK_WINDOW (window), "Event Box");   g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (exit), NULL);   gtk_container_set_border_width (GTK_CONTAINER (window), 10);/* 创建一个事件盒,然后将它加到顶级窗口上 */   event_box = gtk_event_box_new ();   gtk_container_add (GTK_CONTAINER (window), event_box);   gtk_widget_show (event_box);/* 创建一个长标签 */   label = gtk_label_new ("Click here to quit, quit, quit, quit, quit");   gtk_container_add (GTK_CONTAINER (event_box), label);   gtk_widget_show (label);/* 将标签剪裁短。 */   gtk_widget_set_size_request (label, 110, 20);/* 为它绑定一个动作 */   gtk_widget_set_events (event_box, GDK_BUTTON_PRESS_MASK);   g_signal_connect (G_OBJECT (event_box), "button_press_event", G_CALLBACK (exit), NULL);/* 又是一个要有 X 窗口的东西... *///译者注: 要设置鼠标式样也要有 X 窗口。gtk_widget_realize 使构件在没有 show 之前就形成 X 窗口。   gtk_widget_realize (event_box);   gdk_window_set_cursor (event_box->window, gdk_cursor_new (GDK_HAND1));   gtk_widget_show (window);   gtk_main ();   return 0;}

19.固定容器:gtk\_fixed\_new

#include <gtk/gtk.h>/* 我准备偷点懒,用一些全局变量储存固定容器里构件的位置。 */gint x = 50;gint y = 50;/* 这个回调函数将按钮移动到固定容器的新位置。 */void move_button( GtkWidget *widget, GtkWidget *fixed ){   x = (x + 30) % 300;   y = (y + 50) % 300;   gtk_fixed_move (GTK_FIXED (fixed), widget, x, y);}int main( int argc, char *argv[] ){/* GtkWidget 是构件的存储类型 */   GtkWidget *window;   GtkWidget *fixed;   GtkWidget *button;   gint i;/* 初始化 */   gtk_init (&argc, &argv);/* 创建一个新窗口 */   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);   gtk_window_set_title (GTK_WINDOW (window), "Fixed Container");/* 为窗口的 "destroy" 事件设置一个信号处理函数 */   g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);/* 设置窗口的边框宽度 */   gtk_container_set_border_width (GTK_CONTAINER (window), 10);/* 创建一个固定容器 */   fixed = gtk_fixed_new ();   gtk_container_add (GTK_CONTAINER (window), fixed);   gtk_widget_show (fixed);   for (i = 1 ; i <= 3 ; i++) {/* 创建一个标签为"Press me"的新按钮 */   button = gtk_button_new_with_label ("Press me");/* 当按钮接收到 "clicked" 信号时,调用 move_button() 函数,并把这个固定* 容器作为参数传给它 */   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (move_button), fixed);/* 将按钮组装到一个固定容器的窗口中 */   gtk_fixed_put (GTK_FIXED (fixed), button, i*10, i*10);/* 最后一步是显示新建的构件 */   gtk_widget_show (button);   }/* 显示窗口 */   gtk_widget_show (window);/* 进入事件循环 */   gtk_main ();   return 0;}

点击按钮后,按钮位置发生变化,挺好玩的

20.一个简单的frame:gtk\_frame\_new(不同于java的JFrame)

#include <gtk/gtk.h>int main( int argc, char *argv[] ){/* GtkWidget 是构件的存储类型 */   GtkWidget *window;   GtkWidget *frame;/* 初始化 */   gtk_init (&argc, &argv);/* 创建一个新窗口 */   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);   gtk_window_set_title (GTK_WINDOW (window), "Frame Example");/* 在这里我们将 "destroy" 事件连接到一个回调函数 */   g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);   gtk_widget_set_size_request (window, 300, 300);/* 设置窗口的边框宽度 */   gtk_container_set_border_width (GTK_CONTAINER (window), 10);/* 创建一个框架 */   frame = gtk_frame_new (NULL);   gtk_container_add (GTK_CONTAINER (window), frame);/* 设置框架的标签 */   gtk_frame_set_label (GTK_FRAME (frame), "GTK Frame Widget");/* 将标签定位在框架的右边 */   gtk_frame_set_label_align (GTK_FRAME (frame), 1.0, 1.0);/* 设置框架的风格 */   gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_OUT);   gtk_widget_show (frame);/* 显示窗口 */   gtk_widget_show (window);/* 进入事件循环 */   gtk_main ();   return 0;}

gtk\_aspect\_frame_new:更多选项的frame

#include <gtk/gtk.h>int main( int argc, char *argv[] ){   GtkWidget *window;   GtkWidget *aspect_frame;   GtkWidget *drawing_area;    gtk_init (&argc, &argv);    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);   gtk_window_set_title (GTK_WINDOW (window), "Aspect Frame");   g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);   gtk_container_set_border_width (GTK_CONTAINER (window), 10);/* 创建一个比例框架,将它添加到顶级窗口中 */   aspect_frame = gtk_aspect_frame_new ("2x1", /* label */                                          0.5, /* center x */                                          0.5, /* center y */                                            2, /* xsize/ysize = 2 */                                         FALSE /* ignore child's aspect */);   gtk_container_add (GTK_CONTAINER (window), aspect_frame);   gtk_widget_show (aspect_frame);/* 添加一个子构件到比例框架中 */   drawing_area = gtk_drawing_area_new ();/* 要求一个 200×200 的窗口,但是比例框架会给出一个 200×100* 的窗口,因为我们已经指定了 2×1 的比例值 */   gtk_widget_set_size_request (drawing_area, 200, 200);   gtk_container_add (GTK_CONTAINER (aspect_frame), drawing_area);   gtk_widget_show (drawing_area);   gtk_widget_show (window);   gtk_main ();   return 0;}

21.滚动窗口:gtk\_scrolled\_window_new

#include <stdio.h>#include <gtk/gtk.h>/* 创建一个"信息"列表 */GtkWidget *create_list( void ){   GtkWidget *scrolled_window;   GtkWidget *tree_view;   GtkListStore *model;   GtkTreeIter iter;   GtkCellRenderer *cell;   GtkTreeViewColumn *column;    int i;/* 创建一个新的滚动窗口(scrolled window),只有需要时,滚动条才出现 */   scrolled_window = gtk_scrolled_window_new (NULL, NULL);   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),                                   GTK_POLICY_AUTOMATIC,  GTK_POLICY_AUTOMATIC);   model = gtk_list_store_new (1, G_TYPE_STRING);   tree_view = gtk_tree_view_new ();   gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), tree_view);   gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view), GTK_TREE_MODEL (model));   gtk_widget_show (tree_view);/* 在窗口中添加一些消息 */   for (i = 0; i < 10; i++) {      gchar *msg = g_strdup_printf ("Message #%d", i);      gtk_list_store_append (GTK_LIST_STORE (model), &iter);      gtk_list_store_set (GTK_LIST_STORE (model),                          &iter,                          0, msg,                          -1);      g_free (msg);   }   cell = gtk_cell_renderer_text_new ();   column = gtk_tree_view_column_new_with_attributes ("Messages", cell, "text", 0, NULL);   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view),                                GTK_TREE_VIEW_COLUMN (column));   return scrolled_window;}/* 向文本构件中添加一些文本 - 这是当窗口被实例化(realized)时调用的回调函数。* 我们也可以用 gtk_widget_realize 强行将窗口实例化,但这必须在它的层次关系* 确定后(be part of a hierarchy)才行。 */// 译者注: 构件的层次关系就是其 parent 被确定。将一个子构件加到一个容器中// 时,其 parent 就是这个容器。层次关系被确定要求,其 parent 的 parent...也// 确定了。顶级窗口可以不要 parent。只是我的经验理解。void insert_text (GtkTextBuffer *buffer){   GtkTextIter iter;   gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);   gtk_text_buffer_insert (buffer, &iter,                          "From: pathfinder@nasa.gov\n"                          "To: mom@nasa.gov\n"                          "Subject: Made it!\n"                          "\n"                          "We just got in this morning. The weather has been\n"                          "great - clear but cold, and there are lots of fun sights.\n"                          "Sojourner says hi. See you soon.\n"                          " -Path\n", -1);}/* 创建一个滚动文本区域,用于显示一个"信息" */GtkWidget *create_text( void ){   GtkWidget *scrolled_window;   GtkWidget *view;   GtkTextBuffer *buffer;   view = gtk_text_view_new ();   buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));   scrolled_window = gtk_scrolled_window_new (NULL, NULL);   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),                                   GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);   gtk_container_add (GTK_CONTAINER (scrolled_window), view);   insert_text (buffer);   gtk_widget_show_all (scrolled_window);   return scrolled_window;}int main( int argc, char *argv[] ){   GtkWidget *window;   GtkWidget *vpaned;   GtkWidget *list;   GtkWidget *text;    gtk_init (&argc, &argv);    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);   gtk_window_set_title (GTK_WINDOW (window), "Paned Windows");   g_signal_connect (G_OBJECT (window), "destroy",   G_CALLBACK (gtk_main_quit), NULL);   gtk_container_set_border_width (GTK_CONTAINER (window), 10);   gtk_widget_set_size_request (GTK_WIDGET (window), 450, 400);/* 在顶级窗口上添加一个垂直分栏窗口构件 */   vpaned = gtk_hpaned_new ();   gtk_container_add (GTK_CONTAINER (window), vpaned);   gtk_widget_show (vpaned);/* 在分栏窗口的两部分各添加一些构件 */   list = create_list ();   gtk_paned_add1 (GTK_PANED (vpaned), list);   gtk_widget_show (list);   text = create_text ();   gtk_paned_add2 (GTK_PANED (vpaned), text);   gtk_widget_show (text);   gtk_widget_show (window);   gtk_main ();   return 0;}

又一个例子:滚动窗口中放按钮

#include <stdio.h>#include <gtk/gtk.h>void destroy( GtkWidget *widget, gpointer data ){   gtk_main_quit ();}int main( int argc, char *argv[] ){   static GtkWidget *window;   GtkWidget *scrolled_window;   GtkWidget *table;   GtkWidget *button;   char buffer[32];    int i, j;   gtk_init (&argc, &argv); /* 创建一个新的对话框窗口,滚动窗口就放在这个窗口上 */   window = gtk_dialog_new ();   g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy), NULL);   gtk_window_set_title (GTK_WINDOW (window), "GtkScrolledWindow example");   gtk_container_set_border_width (GTK_CONTAINER (window), 0);   gtk_widget_set_size_request (window, 300, 300);/* 创建一个新的滚动窗口。 */   scrolled_window = gtk_scrolled_window_new (NULL, NULL);   gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);/* 滚动条的出现方式可以是 GTK_POLICY_AUTOMATIC 或 GTK_POLICY_ALWAYS。* 设为 GTK_POLICY_AUTOMATIC 将自动决定是否需要出现滚动条* 而设为 GTK_POLICY_ALWAYS,将一直显示一个滚动条* 第一个是设置水平滚动条,第二个是垂直滚动条 */   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),                                   GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);/* 对话框窗口内部包含一个 vbox 构件 */   gtk_box_pack_start (GTK_BOX (GTK_DIALOG(window)->vbox), scrolled_window, TRUE, TRUE, 0);   gtk_widget_show (scrolled_window);/* 创建一个包含 10×10 个格子的表格 */   table = gtk_table_new (10, 10, FALSE);/* 设置 x 和 y 方向的行间间距为 10 像素 */   gtk_table_set_row_spacings (GTK_TABLE (table), 10);   gtk_table_set_col_spacings (GTK_TABLE (table), 10);/* 将表格组装到滚动窗口中 */   gtk_scrolled_window_add_with_viewport ( GTK_SCROLLED_WINDOW (scrolled_window), table);   gtk_widget_show (table);/* 简单地在表格中添加许多开关按钮以展示滚动窗口 */   for (i = 0; i < 10; i++)      for (j = 0; j < 10; j++) {          sprintf (buffer, "button (%d,%d)\n", i, j);          button = gtk_toggle_button_new_with_label (buffer);          gtk_table_attach_defaults (GTK_TABLE (table), button, i, i+1, j, j+1);          gtk_widget_show (button);       }/* 在对话框的底部添加一个"close"按钮 */   button = gtk_button_new_with_label ("close");   g_signal_connect_swapped (G_OBJECT (button), "clicked", G_CALLBACK (gtk_widget_destroy), window);/* 让按钮能被缺省 */   GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button, TRUE, TRUE, 0);/* 将按钮固定为缺省按钮,只要按回车键就相当于点击了这个按钮 */   gtk_widget_grab_default (button);   gtk_widget_show (button);   gtk_widget_show (window);   gtk_main();   return 0;}

22.按钮盒子:button box

#include <gtk/gtk.h>/* 用指定的参数创建一个按钮盒 */GtkWidget *create_bbox( gint horizontal, char *title, gint spacing,                        gint child_w, gint child_h, gint layout ){   GtkWidget *frame;   GtkWidget *bbox;   GtkWidget *button;   frame = gtk_frame_new (title);   if (horizontal)      bbox = gtk_hbutton_box_new ();   else      bbox = gtk_vbutton_box_new ();   gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);   gtk_container_add (GTK_CONTAINER (frame), bbox);/* 设置按钮盒的外观 */   gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), layout);   gtk_box_set_spacing (GTK_BOX (bbox), spacing);/*gtk_button_box_set_child_size (GTK_BUTTON_BOX (bbox), child_w, child_h);*/   button = gtk_button_new_from_stock (GTK_STOCK_OK);   gtk_container_add (GTK_CONTAINER (bbox), button);   button = gtk_button_new_from_stock (GTK_STOCK_CANCEL);   gtk_container_add (GTK_CONTAINER (bbox), button);   button = gtk_button_new_from_stock (GTK_STOCK_HELP);   gtk_container_add (GTK_CONTAINER (bbox), button);   return frame;}int main( int argc, char *argv[] ){   static GtkWidget* window = NULL;   GtkWidget *main_vbox;   GtkWidget *vbox;   GtkWidget *hbox;   GtkWidget *frame_horz;   GtkWidget *frame_vert;/* 初始化 */   gtk_init (&argc, &argv);   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);   gtk_window_set_title (GTK_WINDOW (window), "Button Boxes");   g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);   gtk_container_set_border_width (GTK_CONTAINER (window), 10);    main_vbox = gtk_vbox_new (FALSE, 0);   gtk_container_add (GTK_CONTAINER (window), main_vbox);   frame_horz = gtk_frame_new ("Horizontal Button Boxes");   gtk_box_pack_start (GTK_BOX (main_vbox), frame_horz, TRUE, TRUE, 10);   vbox = gtk_vbox_new (FALSE, 0);   gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);   gtk_container_add (GTK_CONTAINER (frame_horz), vbox);   gtk_box_pack_start (GTK_BOX (vbox),   create_bbox (TRUE, "Spread (spacing 40)", 40, 85, 20,                 GTK_BUTTONBOX_SPREAD), TRUE, TRUE, 0);   gtk_box_pack_start (GTK_BOX (vbox), create_bbox (TRUE, "Edge (spacing 30)", 30, 85, 20,                       GTK_BUTTONBOX_EDGE), TRUE, TRUE, 5);   gtk_box_pack_start (GTK_BOX (vbox),   create_bbox (TRUE, "Start (spacing 20)", 20, 85, 20, GTK_BUTTONBOX_START), TRUE, TRUE, 5);   gtk_box_pack_start (GTK_BOX (vbox), create_bbox (TRUE, "End (spacing 10)", 10, 85, 20,                       GTK_BUTTONBOX_END), TRUE, TRUE, 5);   frame_vert = gtk_frame_new ("Vertical Button Boxes");   gtk_box_pack_start (GTK_BOX (main_vbox), frame_vert, TRUE, TRUE, 10);   hbox = gtk_hbox_new (FALSE, 0);   gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);   gtk_container_add (GTK_CONTAINER (frame_vert), hbox);   gtk_box_pack_start (GTK_BOX (hbox), create_bbox (FALSE, "Spread (spacing 5)", 5, 85, 20,                       GTK_BUTTONBOX_SPREAD), TRUE, TRUE, 0);   gtk_box_pack_start (GTK_BOX (hbox), create_bbox (FALSE, "Edge (spacing 30)", 30, 85, 20,                       GTK_BUTTONBOX_EDGE), TRUE, TRUE, 5);   gtk_box_pack_start (GTK_BOX (hbox), create_bbox (FALSE, "Start (spacing 20)", 20, 85, 20,                       GTK_BUTTONBOX_START), TRUE, TRUE, 5);   gtk_box_pack_start (GTK_BOX (hbox), create_bbox (FALSE, "End (spacing 20)", 20, 85, 20,                       GTK_BUTTONBOX_END), TRUE, TRUE, 5);   gtk_widget_show_all (window);/* 进入事件循环 */   gtk_main ();   return 0;}

23.在aspect_frame中显示一个图片

#include <gtk/gtk.h> #define pixmap GdkPixmap#define pixbuf GdkPixmap void hello( GtkWidget *widget, gpointer   data ){    g_print ("Hello World\n");//temp(data );}gint delete_event( GtkWidget *widget, GdkEvent  *event, gpointer   data ){    g_print ("delete event occurred\n");    return FALSE;}void destroy( GtkWidget *widget, gpointer   data ){    gtk_main_quit ();} int main( int   argc, char *argv[] ){     GtkWidget *window;    GtkWidget *draw;    GtkWidget *frame;        gtk_init (&argc, &argv);         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);    g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL);    g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy), NULL);    gtk_container_set_border_width (GTK_CONTAINER (window), 10);        frame = gtk_aspect_frame_new ("image:",0.5, 0.1,1, FALSE);    gtk_container_add (GTK_CONTAINER (window), frame);     draw = gtk_drawing_area_new();    gtk_widget_set_size_request (draw, 800, 600);    draw = gtk_image_new_from_file("batman.jpg");    // g_signal_connect (G_OBJECT (draw), "clicked", G_CALLBACK (expose_event), NULL);        gtk_container_add (GTK_CONTAINER (frame), draw);        gtk_widget_show_all (window);    gtk_main ();        return 0;}

显示动态图:直接引用GIF,用多张图片显示动图效果

/* 简单的动画 gif.c */#include <gtk/gtk.h>static GtkWidget *ourgif ;static gchar *bmpfile[4] = {"l.bmp","r.bmp","u.bmp","d.bmp" };gint i = 0 ;void change_bmp (){ //依次更改图像实现动态效果   gtk_image_set_from_file(GTK_IMAGE(ourgif),bmpfile[i]);   i++ ;   if ( i == 4 ) i = 0 ;}int main ( int argc , char* argv[]){   GtkWidget *window;   GtkWidget *vbox;   GtkWidget *hbox;   GtkWidget *label;   GtkWidget *image;    gtk_init(&argc,&argv);    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);   g_signal_connect(G_OBJECT(window),"delete_event",         G_CALLBACK(gtk_main_quit),NULL);   gtk_window_set_title(GTK_WINDOW(window),"简单的动画");   //gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);   gtk_container_set_border_width(GTK_CONTAINER(window),10);    vbox = gtk_vbox_new(FALSE,0);   gtk_container_add(GTK_CONTAINER(window),vbox);    label = gtk_label_new("直接引用GIF动画");   gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,5);   image = gtk_image_new_from_file("a.gif");   gtk_box_pack_start(GTK_BOX(vbox),image,FALSE,FALSE,5);    label = gtk_label_new("四幅静态的图像");   gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,5);    hbox = gtk_hbox_new(FALSE,0);   gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,5);    image = gtk_image_new_from_file("l.bmp");   gtk_box_pack_start(GTK_BOX(hbox),image,FALSE,FALSE,5);   image = gtk_image_new_from_file("r.bmp");   gtk_box_pack_start(GTK_BOX(hbox),image,FALSE,FALSE,5);   image = gtk_image_new_from_file("u.bmp");   gtk_box_pack_start(GTK_BOX(hbox),image,FALSE,FALSE,5);   image = gtk_image_new_from_file("d.bmp");   gtk_box_pack_start(GTK_BOX(hbox),image,FALSE,FALSE,5);    label = gtk_label_new("通过时钟控制的动画");   gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,5);    ourgif = gtk_image_new_from_file("p1.bmp");   gtk_box_pack_start(GTK_BOX(vbox),ourgif,FALSE,FALSE,5);    gtk_timeout_add(150,(GtkFunction)change_bmp,NULL);     gtk_widget_show_all(window);   gtk_main();   return FALSE;}

24.画图接口:gdk\_draw\_arc,gdk\_draw\_rectangle

#include <gtk/gtk.h> static void destroy( GtkWidget *widget, gpointer data ){    gtk_main_quit ();}static gboolean my_expose( GtkWidget      *da,                           GdkEventExpose *event,                           gpointer        data ){    GdkGC *gc1, *gc2, *gc;  /*gc1为矩形,gc2为文字*/     GdkColor color;     gc1 = gdk_gc_new( da->window );     color.red = 10000;    color.green = 20000;    color.blue = 30000;    gdk_gc_set_rgb_fg_color(gc1, &color );     gc2 = gdk_gc_new( da->window );     color.red = 1;    color.green = 2;    color.blue = 3;    gdk_gc_set_rgb_fg_color( gc2, &color );     gc = gc1;    gdk_draw_rectangle( da->window, gc, TRUE,//fill or not                           50, 50, 100, 100 );  /*(fx、fz、dx、dz)*/    gc = gc2;    gdk_draw_arc( da->window, gc, TRUE, //fill or not                      50, 50, 100, 100, 0, 270 * 64 );  /*(fx、fz、dx、dz、0、arc)*/     PangoLayout *layout = gtk_widget_create_pango_layout( da, "This is a cube \nand a circle." );     PangoFontDescription *fontdesc = pango_font_description_from_string( "Luxi Mono 8" );     pango_layout_set_font_description( layout, fontdesc );      gdk_draw_layout( da->window, gc1, 50, 155, layout );     pango_font_description_free( fontdesc );     g_object_unref( layout );     g_object_unref( G_OBJECT(gc1) );    g_object_unref( G_OBJECT(gc2) );       return TRUE;}int main( int  argc, char *argv[] ){    GtkWidget *window;    GtkWidget *da; //drawing area    gtk_init (&argc, &argv);    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);    g_signal_connect( G_OBJECT (window), "destroy",                G_CALLBACK (destroy), NULL );        da = gtk_drawing_area_new ();    /* set a minimum size */    gtk_widget_set_size_request( da, 200, 200 );    gtk_container_add( GTK_CONTAINER(window), da );    g_signal_connect( da, "expose_event", G_CALLBACK(my_expose), NULL );    gtk_widget_show_all( window ); //simply show all widgets    gtk_main();        return 0;}

25.文本文件编辑gtk\_text\_view_new

#include <gtk/gtk.h> #include<stdio.h>#include<math.h>#include<stdlib.h>#include<string.h>GtkWidget *text_view; GtkTextBuffer *buffer; GtkTextIter *Iter;  void button_event(GtkWidget *widget,gpointer *data) {    const gchar *text={"How are you!\n"};    GtkTextIter start,end;     gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(buffer),&start,&end);    gtk_text_buffer_insert(GTK_TEXT_BUFFER(buffer),&end,text,strlen(text));} int main(int argc,char *argv[ ]) {     GtkWidget *window;    GtkWidget *button;     GtkWidget *box;      gtk_init(&argc,&argv);     window=gtk_window_new(GTK_WINDOW_TOPLEVEL);     gtk_widget_set_size_request(window,400,300);     g_signal_connect(GTK_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);      box=gtk_vbox_new(FALSE,0);    gtk_container_add(GTK_CONTAINER(window),box);       text_view=gtk_text_view_new();    gtk_widget_set_size_request(text_view,400,250);     gtk_box_pack_start(GTK_BOX(box),text_view,FALSE,FALSE,0);      buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view));     button=gtk_button_new_with_label("sure");    gtk_box_pack_start(GTK_BOX(box),button,FALSE,FALSE,5);     gtk_signal_connect(GTK_OBJECT(button),"clicked",GTK_SIGNAL_FUNC(button_event),NULL);     gtk_widget_show_all(window);     gtk_main();} 

26.菜单/工具栏:gtk\_menu\_new

/* 添加菜单 menu.c */#include <gtk/gtk.h>void on_menu_activate (GtkMenuItem* item,gpointer data){   //g_print("菜单项 %s 被激活\n",(gchar*)data);   g_print("Menuitem %s is pressed.\n",(gchar*)data);}int main (int argc, char* argv[]){   GtkWidget* window;   GtkWidget* box;   GtkWidget* menubar;   GtkWidget* menu;   GtkWidget* editmenu;   GtkWidget* helpmenu;   GtkWidget* rootmenu;   GtkWidget* menuitem;   GtkAccelGroup* accel_group ;    gtk_init(&argc,&argv);    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);   gtk_widget_set_size_request(window,400,300);    gtk_window_set_title(GTK_WINDOW(window),"菜单测试程序");   g_signal_connect(G_OBJECT(window),"destroy",      G_CALLBACK(gtk_main_quit),NULL);   accel_group = gtk_accel_group_new();    gtk_window_add_accel_group(GTK_WINDOW(window),accel_group);// AccelGroup    box = gtk_vbox_new(FALSE,0);   gtk_container_add(GTK_CONTAINER(window),box);   menu = gtk_menu_new();//文件菜单   menuitem = gtk_image_menu_item_new_from_stock      (GTK_STOCK_NEW,accel_group);   gtk_menu_shell_append(GTK_MENU_SHELL(menu),menuitem);   g_signal_connect(G_OBJECT(menuitem),"activate",      G_CALLBACK(on_menu_activate),//(gpointer)("新建"));      (gpointer)("New"));   menuitem = gtk_image_menu_item_new_from_stock      (GTK_STOCK_OPEN,accel_group);   gtk_menu_shell_append(GTK_MENU_SHELL(menu),menuitem);   g_signal_connect(G_OBJECT(menuitem),"activate",      G_CALLBACK(on_menu_activate),//(gpointer)("打开"));      (gpointer)("Open"));   menuitem = gtk_image_menu_item_new_from_stock      (GTK_STOCK_SAVE,accel_group);   gtk_menu_shell_append(GTK_MENU_SHELL(menu),menuitem);   g_signal_connect(G_OBJECT(menuitem),"activate",      G_CALLBACK(on_menu_activate),//(gpointer)("保存"));      (gpointer)("Save"));   menuitem = gtk_image_menu_item_new_from_stock      (GTK_STOCK_SAVE_AS,accel_group);   gtk_menu_shell_append(GTK_MENU_SHELL(menu),menuitem);   g_signal_connect(G_OBJECT(menuitem),"activate",      G_CALLBACK(on_menu_activate),//(gpointer)("另存为"));      (gpointer)("Save As"));   menuitem = gtk_separator_menu_item_new();   gtk_menu_shell_append(GTK_MENU_SHELL(menu),menuitem);   menuitem = gtk_image_menu_item_new_from_stock      (GTK_STOCK_QUIT,accel_group);   gtk_menu_shell_append(GTK_MENU_SHELL(menu),menuitem);   g_signal_connect(G_OBJECT(menuitem),"activate",      G_CALLBACK(on_menu_activate),//(gpointer)("退出"));      (gpointer)("Exit"));   rootmenu = gtk_menu_item_new_with_label(" 文件 ");   gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu),menu);   menubar = gtk_menu_bar_new();   gtk_menu_shell_append(GTK_MENU_SHELL(menubar),rootmenu);   rootmenu = gtk_menu_item_new_with_label(" 编辑 ");   editmenu = gtk_menu_new();//编辑菜单   menuitem = gtk_image_menu_item_new_from_stock      (GTK_STOCK_CUT,accel_group);   gtk_menu_shell_append(GTK_MENU_SHELL(editmenu),menuitem);   g_signal_connect(G_OBJECT(menuitem),"activate",      G_CALLBACK(on_menu_activate),//(gpointer)("剪切"));      (gpointer)("Cut"));   menuitem = gtk_image_menu_item_new_from_stock      (GTK_STOCK_COPY,accel_group);   gtk_menu_shell_append(GTK_MENU_SHELL(editmenu),menuitem);   g_signal_connect(G_OBJECT(menuitem),"activate",      G_CALLBACK(on_menu_activate),//(gpointer)("复制"));      (gpointer)("Copy"));   menuitem = gtk_image_menu_item_new_from_stock      (GTK_STOCK_PASTE,accel_group);   gtk_menu_shell_append(GTK_MENU_SHELL(editmenu),menuitem);   g_signal_connect(G_OBJECT(menuitem),"activate",      G_CALLBACK(on_menu_activate),//(gpointer)("粘贴"));      (gpointer)("Paste"));   menuitem = gtk_image_menu_item_new_from_stock      (GTK_STOCK_FIND,accel_group);   gtk_menu_shell_append(GTK_MENU_SHELL(editmenu),menuitem);   g_signal_connect(G_OBJECT(menuitem),"activate",      G_CALLBACK(on_menu_activate),//(gpointer)("查找"));      (gpointer)("Search"));   gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu),editmenu);   gtk_menu_shell_append(GTK_MENU_SHELL(menubar),rootmenu);   rootmenu = gtk_menu_item_new_with_label(" 帮助 ");   helpmenu = gtk_menu_new();   menuitem = gtk_image_menu_item_new_from_stock      (GTK_STOCK_HELP,accel_group);   gtk_menu_shell_append(GTK_MENU_SHELL(helpmenu),menuitem);   g_signal_connect(G_OBJECT(menuitem),"activate",      G_CALLBACK(on_menu_activate),//(gpointer)("帮助"));      (gpointer)("Help"));   menuitem = gtk_menu_item_new_with_label(" 关于... ");   gtk_menu_shell_append(GTK_MENU_SHELL(helpmenu),menuitem);   g_signal_connect(G_OBJECT(menuitem),"activate",      G_CALLBACK(on_menu_activate),//(gpointer)("关于"));   (gpointer)("About"));   gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu),helpmenu);   gtk_menu_shell_append(GTK_MENU_SHELL(menubar),rootmenu);   gtk_box_pack_start(GTK_BOX(box),menubar,FALSE,FALSE,0);   gtk_widget_show_all(window);   gtk_main();   return FALSE;}

27.工具栏/条:gtk\_toolbar\_new

/* 添加工具条 toolbar.c*/#include <gtk/gtk.h>void on_button_clicked (GtkButton* button,gpointer data){   g_print("你点击的按钮是 %s \n",(gchar*)data);}int main (int argc, char* argv[]){   GtkWidget* window;   GtkWidget* box ;   GtkWidget* toolbar ;   GtkWidget* entry ;   GtkWidget* label ;    gtk_init(&argc,&argv);    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);   gtk_widget_set_size_request(window,700,100);    gtk_window_set_title(GTK_WINDOW(window),"添加工具条");   g_signal_connect(G_OBJECT(window),"destroy",      G_CALLBACK(gtk_main_quit),NULL);    box = gtk_vbox_new(FALSE,0);   gtk_container_add(GTK_CONTAINER(window),box);   toolbar = gtk_toolbar_new();   gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar),GTK_STOCK_NEW,      "新建一个文件","新建",      GTK_SIGNAL_FUNC(on_button_clicked),      (gpointer)("新建"),-1);    gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar),GTK_STOCK_OPEN,      "打开一个文件","打开",      GTK_SIGNAL_FUNC(on_button_clicked),      (gpointer)("打开"),-1);    gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar),GTK_STOCK_SAVE,      "保存当前文件","保存",      GTK_SIGNAL_FUNC(on_button_clicked),      (gpointer)("保存"),-1);    gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));   label = gtk_label_new(" 文件名:");   gtk_toolbar_append_widget(GTK_TOOLBAR(toolbar),label,      "这是一个标签","标签");   entry = gtk_entry_new();   gtk_toolbar_append_widget(GTK_TOOLBAR(toolbar),entry,      "这是一个录入条","录入");   gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));   gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar),GTK_STOCK_CUT,      "剪切","剪切",      GTK_SIGNAL_FUNC(on_button_clicked),      (gpointer)("剪切"),-1);   gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar),GTK_STOCK_COPY,      "复制","复制",      GTK_SIGNAL_FUNC(on_button_clicked),      (gpointer)("复制"),-1);   gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar),GTK_STOCK_PASTE,      "粘贴","粘贴",      GTK_SIGNAL_FUNC(on_button_clicked),      (gpointer)("粘贴"),-1);   gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));   gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar),GTK_STOCK_QUIT,      "退出","退出",      GTK_SIGNAL_FUNC(on_button_clicked),      (gpointer)("退出"),-1);   gtk_toolbar_set_style(GTK_TOOLBAR(toolbar),GTK_TOOLBAR_ICONS);   gtk_toolbar_set_icon_size(GTK_TOOLBAR(toolbar),      GTK_ICON_SIZE_SMALL_TOOLBAR);   gtk_box_pack_start(GTK_BOX(box),toolbar,FALSE,FALSE,0);   gtk_widget_show_all(window);   gtk_main();   return FALSE;}

28.浮动的工具条的菜单

/* 浮动的工具条和菜单 handle.c */#include <gtk/gtk.h>//创建自己按钮的函数GtkWidget* create_button (char *filename){   GtkWidget* image;   GtkWidget* button;   image = gtk_image_new_from_file(filename) ;   gtk_widget_show(image);   button = gtk_button_new();   gtk_container_add(GTK_CONTAINER(button),image) ;   return button ;}//主函数int main (int argc, char *argv[]){   GtkWidget* window;   GtkWidget* vbox;   GtkWidget* hbox;   GtkWidget* box;   GtkWidget* box1;   GtkWidget* handle;   GtkWidget* handle1;   GtkWidget* menubar;   GtkWidget* button1;   GtkWidget* button2;   GtkWidget* button3;   GtkWidget* button4;   GtkWidget* menu;   GtkWidget* menuitem;   GtkWidget* rootmenu;   GtkTooltips* button_tips;    char* title = "浮动的工具条和菜单";    gtk_init(&argc,&argv);    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);   gtk_window_set_title(GTK_WINDOW(window),title);   gtk_container_set_border_width(GTK_CONTAINER(window),5);   g_signal_connect(G_OBJECT(window),"destroy",      G_CALLBACK(gtk_main_quit),NULL);    vbox = gtk_vbox_new(FALSE,0);   gtk_container_add(GTK_CONTAINER(window),vbox);    hbox = gtk_hbox_new(FALSE,0);   gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,5);    handle = gtk_handle_box_new();   gtk_box_pack_start(GTK_BOX(hbox),handle,FALSE,FALSE,5);    box = gtk_hbox_new(FALSE,0);   gtk_container_add(GTK_CONTAINER(handle),box);    button1 = create_button("win7.jpg") ;   gtk_box_pack_start(GTK_BOX(box),button1,FALSE,FALSE,3);    button2 = create_button("dir.jpg");   gtk_box_pack_start(GTK_BOX(box),button2,FALSE,FALSE,3);    button3 = create_button("save.gif");   gtk_box_pack_start(GTK_BOX(box),button3,FALSE,FALSE,3);    button4 = create_button("quit.gif");   gtk_box_pack_start(GTK_BOX(box),button4,FALSE,FALSE,3);    button_tips = gtk_tooltips_new();   gtk_tooltips_set_tip(GTK_TOOLTIPS(button_tips),button1,      "创建一个新文件","New");   gtk_tooltips_set_tip(GTK_TOOLTIPS(button_tips),button2,      "打开文件","Open");   gtk_tooltips_set_tip(GTK_TOOLTIPS(button_tips),button3,      "保存当前编辑的文件","Save");   gtk_tooltips_set_tip(GTK_TOOLTIPS(button_tips),button4,      "退出此程序","Quit");   handle1 = gtk_handle_box_new();   gtk_box_pack_start(GTK_BOX(hbox),handle1,FALSE,FALSE,5);   box1 = gtk_hbox_new(FALSE,0);   gtk_container_add(GTK_CONTAINER(handle1),box1);   menubar = gtk_menu_bar_new();   gtk_box_pack_start(GTK_BOX(box1),menubar,FALSE,FALSE,5);   menu = gtk_menu_new();   menuitem = gtk_menu_item_new_with_label("菜单项一");   gtk_menu_shell_append(GTK_MENU_SHELL(menu),menuitem);   menuitem = gtk_menu_item_new_with_label("菜单项二");   gtk_menu_shell_append(GTK_MENU_SHELL(menu),menuitem);   rootmenu = gtk_menu_item_new_with_label(" 文件 ");   gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu),menu);   gtk_menu_shell_append(GTK_MENU_SHELL(menubar),rootmenu);   gtk_widget_show_all(window);   gtk_main();   return FALSE ;}

29.一个文本编辑器:包含menu,toolbar,statusbar

// A app /////////////////////////////////////////////////////////////////////////////////////////////////////a///////////////////////////////////////////////////////////////////////////////////////////////////a///////////////////////////////////////////////////////////////////////////////////////////////////a///////////////////////////////////////////////////////////////////////////////////////////////////a/*a 回调函数文件 callbacks.c */#include <gtk/gtk.h>gboolean on_window_delete_event (GtkWidget* widget,GdkEvent *event,gpointer data){   gtk_main_quit();   return FALSE;}void on_file_new_activate (GtkMenuItem* menuitem, gpointer data){   g_print("the file_new is clicked .\n");}void on_file_open_activate (GtkMenuItem* menuitem, gpointer data){}void on_file_save_activate (GtkMenuItem* menuitem, gpointer data){}void on_file_saveas_activate (GtkMenuItem* menuitem, gpointer data){}void on_file_exit_activate (GtkMenuItem* menuitem,gpointer data){}void on_edit_cut_activate (GtkMenuItem* menuitem,gpointer data){}void on_edit_copy_activate (GtkMenuItem* menuitem,gpointer data){}void on_edit_paste_activate (GtkMenuItem* menuitem,gpointer data){}void on_edit_selectall_activate (GtkMenuItem* menuitem,gpointer data){}void on_edit_find_activate (GtkMenuItem* menuitem,gpointer data){}void on_help_help_activate (GtkMenuItem* menuitem,gpointer data){}void on_help_about_activate (GtkMenuItem* menuitem,gpointer data){} ///////////////////////////////////////////////////////////////////////////////////////////////////a///////////////////////////////////////////////////////////////////////////////////////////////////a///////////////////////////////////////////////////////////////////////////////////////////////////a///////////////////////////////////////////////////////////////////////////////////////////////////a/* 界面代码文件 interface.c *///#include <gtk/gtk.h>//#include "callbacks.h"GtkWidget* create_menu (GtkAccelGroup* accel_group,GtkWidget *window);GtkWidget* create_toolbar (GtkWidget* window);GtkWidget* create_window (void){   GtkWidget* window;   GtkWidget* text;   GtkWidget* scrolledwin;   GtkWidget* box;   GtkWidget* statusbar;   GtkWidget* menubar ;   GtkWidget* toolbar ;   GtkAccelGroup* accel_group ;   window = gtk_window_new(GTK_WINDOW_TOPLEVEL);   gtk_window_set_title(GTK_WINDOW(window),"完整的应用程序窗口");   gtk_window_set_default_size(GTK_WINDOW(window),400,300);   accel_group = gtk_accel_group_new();   gtk_window_add_accel_group(GTK_WINDOW(window),accel_group);   box = gtk_vbox_new(FALSE,0);   gtk_container_add (GTK_CONTAINER (window), box);   menubar = create_menu(accel_group,window);   gtk_box_pack_start(GTK_BOX(box),menubar,0,0,0);   toolbar = create_toolbar(window);   gtk_box_pack_start(GTK_BOX(box),toolbar,0,1,0);   scrolledwin = gtk_scrolled_window_new(NULL,NULL);   text = gtk_text_view_new();   gtk_box_pack_start(GTK_BOX(box),scrolledwin,TRUE,TRUE,0);   gtk_container_add(GTK_CONTAINER(scrolledwin),text);   gtk_text_view_set_editable(GTK_TEXT_VIEW(text),TRUE);   statusbar = gtk_statusbar_new();   gtk_box_pack_start(GTK_BOX(box),statusbar,FALSE,FALSE,0);   gtk_widget_show_all(window);   return window;}GtkWidget* create_menu (GtkAccelGroup* accel_group,GtkWidget *window){   GtkWidget* menubar;   GtkWidget* menu;   GtkWidget* editmenu;   GtkWidget* helpmenu;   GtkWidget* rootmenu;   GtkWidget* menuitem;   menu = gtk_menu_new();//文件菜单   menuitem = gtk_image_menu_item_new_from_stock      (GTK_STOCK_NEW,accel_group);   gtk_menu_shell_append(GTK_MENU_SHELL(menu),menuitem);   g_signal_connect(G_OBJECT(menuitem),"activate",      G_CALLBACK(on_file_new_activate),NULL);   menuitem = gtk_image_menu_item_new_from_stock      (GTK_STOCK_OPEN,accel_group);   gtk_menu_shell_append(GTK_MENU_SHELL(menu),menuitem);   g_signal_connect(G_OBJECT(menuitem),"activate",      G_CALLBACK(on_file_new_activate),NULL);   menuitem = gtk_image_menu_item_new_from_stock      (GTK_STOCK_SAVE,accel_group);   gtk_menu_shell_append(GTK_MENU_SHELL(menu),menuitem);   menuitem = gtk_image_menu_item_new_from_stock      (GTK_STOCK_SAVE_AS,accel_group);   gtk_menu_shell_append(GTK_MENU_SHELL(menu),menuitem);   menuitem = gtk_separator_menu_item_new();   gtk_menu_shell_append(GTK_MENU_SHELL(menu),menuitem);   menuitem = gtk_image_menu_item_new_from_stock      (GTK_STOCK_QUIT,accel_group);   gtk_menu_shell_append(GTK_MENU_SHELL(menu),menuitem);   g_signal_connect(G_OBJECT(menuitem),"activate",      G_CALLBACK(on_window_delete_event),NULL);   rootmenu = gtk_menu_item_new_with_label(" 文件 ");   gtk_widget_show(rootmenu);   gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu),menu);   menubar = gtk_menu_bar_new();   gtk_menu_shell_append(GTK_MENU_SHELL(menubar),rootmenu);   rootmenu = gtk_menu_item_new_with_label(" 编辑 ");   editmenu = gtk_menu_new();//编辑菜单   menuitem = gtk_image_menu_item_new_from_stock      (GTK_STOCK_CUT,accel_group);   gtk_menu_shell_append(GTK_MENU_SHELL(editmenu),menuitem);   g_signal_connect(G_OBJECT(menuitem),"activate",      G_CALLBACK(on_edit_cut_activate),NULL);   menuitem = gtk_image_menu_item_new_from_stock      (GTK_STOCK_COPY,accel_group);   gtk_menu_shell_append(GTK_MENU_SHELL(editmenu),menuitem);   g_signal_connect(G_OBJECT(menuitem),"activate",      G_CALLBACK(on_edit_copy_activate),NULL);   menuitem = gtk_image_menu_item_new_from_stock      (GTK_STOCK_PASTE,accel_group);   gtk_menu_shell_append(GTK_MENU_SHELL(editmenu),menuitem);   g_signal_connect(G_OBJECT(menuitem),"activate",      G_CALLBACK(on_edit_paste_activate),NULL);   menuitem = gtk_image_menu_item_new_from_stock      (GTK_STOCK_FIND,accel_group);   gtk_menu_shell_append(GTK_MENU_SHELL(editmenu),menuitem);   g_signal_connect(G_OBJECT(menuitem),"activate",      G_CALLBACK(on_edit_find_activate),NULL);   gtk_widget_show(rootmenu);   gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu),editmenu);   gtk_menu_shell_append(GTK_MENU_SHELL(menubar),rootmenu);   rootmenu = gtk_menu_item_new_with_label(" 帮助 ");   helpmenu = gtk_menu_new();   menuitem = gtk_image_menu_item_new_from_stock      (GTK_STOCK_HELP,accel_group);   gtk_menu_shell_append(GTK_MENU_SHELL(helpmenu),menuitem);   g_signal_connect(G_OBJECT(menuitem),"activate",      G_CALLBACK(on_help_help_activate),NULL);   menuitem = gtk_menu_item_new_with_label(" 关于 ");   gtk_menu_shell_append(GTK_MENU_SHELL(helpmenu),menuitem);   g_signal_connect(G_OBJECT(menuitem),"activate",      G_CALLBACK(on_help_about_activate),NULL);   gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu),helpmenu);   gtk_menu_shell_append(GTK_MENU_SHELL(menubar),rootmenu);   return menubar ;}GtkWidget* create_toolbar (GtkWidget* window){   GtkWidget* toolbar ;   toolbar = gtk_toolbar_new();   gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar),      GTK_STOCK_NEW,      "创建一个新文件","新建",      GTK_SIGNAL_FUNC(on_file_new_activate),      window,-1);   gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar),      GTK_STOCK_OPEN,      "打开一个文件","打开",      GTK_SIGNAL_FUNC(on_file_open_activate),      toolbar,-1);   gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar),      GTK_STOCK_SAVE,      "保存当前文件","保存",      GTK_SIGNAL_FUNC(on_file_save_activate),      toolbar,-1);   return toolbar;}///////////////////////////////////////////////////////////////////////////////////////////////////a///////////////////////////////////////////////////////////////////////////////////////////////////a///////////////////////////////////////////////////////////////////////////////////////////////////a///////////////////////////////////////////////////////////////////////////////////////////////////a/* 主函数文件 main.c*///#include <gtk/gtk.h>//#include "callbacks.h"//#include "interface.h"int main (int argc , gchar* argv[]){   GtkWidget * window ;   gtk_init(&argc,&argv);   window = create_window();   g_signal_connect(G_OBJECT(window),"delete_event",      G_CALLBACK(on_window_delete_event),NULL);   gtk_widget_show(window);   gtk_main();   return FALSE;}

30.模拟90坦克游戏:在frame中移动一个图片,键盘控制走向

/* 坦克游戏 tank.c */#include <gtk/gtk.h>#include <gdk/gdkkeysyms.h>enum _FORWARD { LEFT, UP, RIGHT, DOWN } ;typedef enum _FORWARD Forward; //定义方向类型void move (Forward fw);void key_press (GtkWidget* widget,GdkEventKey *event,gpointer data);static gchar* tank_file[4] = {"u.bmp","r.bmp","d.bmp","l.bmp"};static GtkWidget *fixed;static GtkWidget *tank_image;gint i = 75 ;gint j = 75 ;Forward forward = UP ;//定义方向void move (Forward fw){   switch(fw)   {      case UP :         j = j - 5 ;         if ( j < 0 ) j = 400 ;         gtk_image_set_from_file(GTK_IMAGE(tank_image),tank_file[0]);         gtk_fixed_move(GTK_FIXED(fixed),tank_image,i,j);         break;      case DOWN :         j = j + 5;         if ( j > 400 ) j = 0 ;         gtk_image_set_from_file(GTK_IMAGE(tank_image),tank_file[2]);         gtk_fixed_move(GTK_FIXED(fixed),tank_image,i,j);         break;      case LEFT :         i = i - 5;         if ( i < 0 ) i = 400 ;         gtk_image_set_from_file(GTK_IMAGE(tank_image),tank_file[3]);         gtk_fixed_move(GTK_FIXED(fixed),tank_image,i,j);         break;      case RIGHT :         i = i + 5;         if ( i > 400 ) i = 0 ;         gtk_image_set_from_file(GTK_IMAGE(tank_image),tank_file[1]);         gtk_fixed_move(GTK_FIXED(fixed),tank_image,i,j);         break;   }}void key_press (GtkWidget* widget,GdkEventKey *event,gpointer data){   switch(event->keyval)   {      case GDK_Up :         forward = UP;         move(forward);         break;      case GDK_Down :         forward = DOWN;         move(forward);         break;      case GDK_Left :         forward = LEFT;         move(forward);         break;      case GDK_Right :         forward = RIGHT;         move(forward);         break;   }}//主函数int main (int argc, char *argv[]){   GtkWidget* window;   GtkWidget* vbox;   GtkWidget* bbox;   GtkWidget* sep;   GtkWidget* frame;   GtkWidget* button;    gtk_init(&argc,&argv);    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);   gtk_window_set_title(GTK_WINDOW(window),"坦克游戏");   gtk_container_set_border_width(GTK_CONTAINER(window),10);   g_signal_connect(G_OBJECT(window),"destroy",      G_CALLBACK(gtk_main_quit),NULL);    g_signal_connect(G_OBJECT(window),"key_press_event",      G_CALLBACK(key_press),NULL);////keyboard input    vbox = gtk_vbox_new(FALSE,0);   gtk_container_add(GTK_CONTAINER(window),vbox);    frame = gtk_frame_new(NULL);   gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_ETCHED_OUT);    fixed = gtk_fixed_new();   gtk_fixed_set_has_window(GTK_FIXED(fixed),TRUE);   gtk_widget_set_size_request(fixed,400,400);    gtk_container_add(GTK_CONTAINER(frame),fixed);   gtk_box_pack_start(GTK_BOX(vbox),frame,TRUE,TRUE,5);    sep = gtk_hseparator_new();   gtk_box_pack_start(GTK_BOX(vbox),sep,FALSE,FALSE,5);    bbox = gtk_hbutton_box_new();   gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox),GTK_BUTTONBOX_END);   gtk_box_pack_start(GTK_BOX(vbox),bbox,FALSE,FALSE,5);    button = gtk_button_new_from_stock(GTK_STOCK_QUIT);   g_signal_connect(G_OBJECT(button),"clicked",      G_CALLBACK(gtk_main_quit),NULL);   gtk_box_pack_end(GTK_BOX(bbox),button,FALSE,FALSE,5);    tank_image = gtk_image_new_from_file(tank_file[0]);   gtk_fixed_put(GTK_FIXED(fixed),tank_image,i,j);   gtk_widget_show_all(window);   gtk_main();   return FALSE ;}

31.pixmap:

网址:https://developer.gimp.org/api/2.0/gdk-pixbuf/gdk-pixbuf-creating.html

我暂时没找到一个pixmap的图像,等找到以后在更新

/* 图像的直接引用 pixmap.c */#include <gtk/gtk.h>#include "a.h" //这里买年包含了一个pixmap图像int main ( int argc , char* argv[]){   GtkWidget *window;   GtkWidget *vbox;   GtkWidget *frame;   GtkWidget *image;   GdkPixbuf *pixbuf;   GdkPixbuf *pix1,*pix2,*pix3;    gtk_init(&argc,&argv);    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);   g_signal_connect(G_OBJECT(window),"delete_event",      G_CALLBACK(gtk_main_quit),NULL);   gtk_window_set_title(GTK_WINDOW(window),"图像的直接引用");   gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);   gtk_container_set_border_width(GTK_CONTAINER(window),10);    vbox = gtk_vbox_new(FALSE,0);   gtk_container_add(GTK_CONTAINER(window),vbox);    pixbuf = gdk_pixbuf_new_from_file("b.png",NULL);   frame = gtk_frame_new("这是一幅完整的图像");   image = gtk_image_new_from_pixbuf(pixbuf);   gtk_box_pack_start(GTK_BOX(vbox),frame,FALSE,FALSE,5);   gtk_container_add(GTK_CONTAINER(frame),image);    pix1 = gdk_pixbuf_new_subpixbuf(pixbuf,280,40,40,40);   frame = gtk_frame_new("从上图中分割出来的一幅图像");   image = gtk_image_new_from_pixbuf(pix1);   gtk_container_add(GTK_CONTAINER(frame),image);   gtk_box_pack_start(GTK_BOX(vbox),frame,FALSE,FALSE,5);    pix2 =gdk_pixbuf_new_from_inline(22400+24,pieces_inline,TRUE,NULL);   frame = gtk_frame_new("内建的一幅图像");   image = gtk_image_new_from_pixbuf(pix2);   gtk_container_add(GTK_CONTAINER(frame),image);   gtk_box_pack_start(GTK_BOX(vbox),frame,FALSE,FALSE,5);   pix3 = gdk_pixbuf_new_subpixbuf(pix2,120,20,20,20);   frame = gtk_frame_new("从内建图像中分割出来的一幅图像");   image = gtk_image_new_from_pixbuf(pix3);   gtk_container_add(GTK_CONTAINER(frame),image);   gtk_box_pack_start(GTK_BOX(vbox),frame,FALSE,FALSE,5);   gtk_widget_show_all(window);   gtk_main();   return FALSE;}

32.固定调节数值的按钮:gtk\_spin\_button\_new\_with_range

/* 滚动按钮 spin.c */#include <gtk/gtk.h>int main (int argc, char* argv[]){   GtkWidget* window;   GtkWidget* vbox;   GtkWidget* frame;   GtkWidget* spin;   GtkWidget* label;   GtkWidget* vvbox;   GtkWidget *hbox,*vbox1,*vbox2,*vbox3;   GtkAdjustment* adj1;    gtk_init(&argc,&argv);    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);   gtk_window_set_title(GTK_WINDOW(window),"滚动按钮");   g_signal_connect(G_OBJECT(window),"destroy",            G_CALLBACK(gtk_main_quit),NULL);   gtk_container_set_border_width(GTK_CONTAINER(window),10);    vbox = gtk_vbox_new(FALSE,0);   gtk_container_add(GTK_CONTAINER(window),vbox);    frame = gtk_frame_new("日历");   gtk_box_pack_start(GTK_BOX(vbox),frame,FALSE,FALSE,5);    hbox = gtk_hbox_new(FALSE,0);   gtk_container_add(GTK_CONTAINER(frame),hbox);   gtk_container_set_border_width(GTK_CONTAINER(hbox),10);    vbox1 = gtk_vbox_new(TRUE,0);   gtk_box_pack_start(GTK_BOX(hbox),vbox1,TRUE,TRUE,5);   label = gtk_label_new("年:");   gtk_box_pack_start(GTK_BOX(vbox1),label,FALSE,FALSE,2);   spin = gtk_spin_button_new_with_range(2019,2100,1);   gtk_box_pack_start(GTK_BOX(vbox1),spin,FALSE,FALSE,2);    vbox2 = gtk_vbox_new(TRUE,0);   gtk_box_pack_start(GTK_BOX(hbox),vbox2,TRUE,TRUE,5);   label = gtk_label_new("月:");   gtk_box_pack_start(GTK_BOX(vbox2),label,FALSE,FALSE,2);   spin = gtk_spin_button_new_with_range(1,12,1);   gtk_box_pack_start(GTK_BOX(vbox2),spin,FALSE,FALSE,2);    vbox3 = gtk_vbox_new(TRUE,0);   gtk_box_pack_start(GTK_BOX(hbox),vbox3,TRUE,TRUE,5);   label = gtk_label_new("日:");   gtk_box_pack_start(GTK_BOX(vbox3),label,FALSE,FALSE,2);   spin = gtk_spin_button_new_with_range(1,31,1);   gtk_box_pack_start(GTK_BOX(vbox3),spin,FALSE,FALSE,2);    frame = gtk_frame_new(NULL);   gtk_box_pack_start(GTK_BOX(vbox),frame,FALSE,FALSE,5);    vvbox = gtk_vbox_new(FALSE,0);   gtk_container_add(GTK_CONTAINER(frame),vvbox);   gtk_container_set_border_width(GTK_CONTAINER(vvbox),10);    label = gtk_label_new("第一个滚动按钮,\n显示整数,范围: 0 - 100");    adj1 = (GtkAdjustment *) gtk_adjustment_new (50.0, 0.0, 100.0, 1.0,  5.0, 5.0);    spin = gtk_spin_button_new(adj1,5,1);   gtk_box_pack_start(GTK_BOX(vvbox),label,FALSE,FALSE,3);   gtk_box_pack_start(GTK_BOX(vvbox),spin,FALSE,FALSE,3);    label = gtk_label_new("第二个滚动按钮,\n显示浮点数,范围: 0.1 - 1.50");    spin = gtk_spin_button_new_with_range(0,9.9,0.1);   gtk_box_pack_start(GTK_BOX(vvbox),label,FALSE,FALSE,3);   gtk_box_pack_start(GTK_BOX(vvbox),spin,FALSE,FALSE,3);     gtk_widget_show_all(window);   gtk_main();   return FALSE;}

33.分隔面板:gtk\_hpanel\_new,gtk\_vpanel\_new(未编译)

/* 分隔面板 panel.c */#include <gtk/gtk.h>int main (int argc, char* argv[]){   GtkWidget *window;   GtkWidget *panel;   GtkWidget *panel1;   GtkWidget *button1;   GtkWidget *button2;   GtkWidget *button3;    gtk_init(&argc,&argv);    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);   gtk_window_set_title(GTK_WINDOW(window),"分隔面板测试程序");   g_signal_connect(G_OBJECT(window),"destroy",         G_CALLBACK(gtk_main_quit),NULL);    panel = gtk_hpanel_new();   gtk_container_add(GTK_CONTAINER(window),panel);   gtk_widget_show(panel);    button1 = gtk_button_new_with_label("按钮一");   gtk_panel_add1(GTK_PANEL(panel),button1);   gtk_widget_show(button1);    panel1 = gtk_vpanel_new();   gtk_panel_add2(GTK_PANEL(panel),panel1);   gtk_widget_show(panel1);    button2 = gtk_button_new_with_label("按钮二");   gtk_panel_add1(GTK_PANEL(panel1),button2);   gtk_widget_show(button2);    button3 = gtk_button_new_with_label("按钮三");   gtk_panel_add2(GTK_PANEL(panel1),button3);   gtk_widget_show(button3);     gtk_widget_show(window);   gtk_main();   return FALSE;}

34.会话窗口:gtk\_button\_new\_from\_stock

共四种:

GTK\_STOCK\_DIALOG_INFO, 

GTK\_STOCK\_DIALOG_ERROR,

GTK\_STOCK\_DIALOG_QUESTION,

GTK\_STOCK\_DIALOG_WARNING

/* 消息对话框测试程序 message.c*/#include <gtk/gtk.h>static void on_button_clicked (GtkWidget* button,gint data){   GtkWidget* dialog ;   GtkMessageType type ;   gchar *message;   switch((int)data)   {      case 1 :         message = "这是一个信息提示对话框.";         type = GTK_MESSAGE_INFO ; break;      case 2 :         message = "这是一个错误提示对话框.";         type = GTK_MESSAGE_ERROR ; break;      case 3 :         message = "这是一个问题提示对话框.";         type = GTK_MESSAGE_QUESTION ; break;      case 4 :         message = "这是一个警告提示对话框.";         type = GTK_MESSAGE_WARNING ; break;   }//   dialog = gtk_message_dialog_new(NULL,         GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,         type ,         GTK_BUTTONS_OK,         message);   gtk_dialog_run(GTK_DIALOG(dialog));   gtk_widget_destroy(dialog);}int main (int argc, char* argv[]){   GtkWidget* window;   GtkWidget* frame;   GtkWidget* box;   GtkWidget* button1;   GtkWidget* button2;   GtkWidget* button3;   GtkWidget* button4;    gtk_init(&argc,&argv);    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);   gtk_window_set_title(GTK_WINDOW(window),"创建消息框");   g_signal_connect(G_OBJECT(window),"destroy",         G_CALLBACK(gtk_main_quit),NULL);   gtk_container_set_border_width(GTK_CONTAINER(window),20);    frame = gtk_frame_new("四种消息对话框:");   gtk_container_add(GTK_CONTAINER(window),frame);    box = gtk_hbox_new(TRUE,0);   gtk_container_add(GTK_CONTAINER(frame),box);   gtk_container_set_border_width(GTK_CONTAINER(box),20);    button1= gtk_button_new_from_stock(GTK_STOCK_DIALOG_INFO);   gtk_box_pack_start(GTK_BOX(box),button1,FALSE,FALSE,5);   g_signal_connect(G_OBJECT(button1),"clicked",         G_CALLBACK(on_button_clicked),(gpointer)1);    button2 = gtk_button_new_from_stock(GTK_STOCK_DIALOG_ERROR);   gtk_box_pack_start(GTK_BOX(box),button2,FALSE,FALSE,5);   g_signal_connect(G_OBJECT(button2),"clicked",         G_CALLBACK(on_button_clicked),(gpointer)2);    button3 = gtk_button_new_from_stock(GTK_STOCK_DIALOG_QUESTION);   gtk_box_pack_start(GTK_BOX(box),button3,FALSE,FALSE,5);   g_signal_connect(G_OBJECT(button3),"clicked",         G_CALLBACK(on_button_clicked),(gpointer)3);    button4 = gtk_button_new_from_stock(GTK_STOCK_DIALOG_WARNING);   gtk_box_pack_start(GTK_BOX(box),button4,FALSE,FALSE,5);   g_signal_connect(G_OBJECT(button4),"clicked",         G_CALLBACK(on_button_clicked),(gpointer)4);     gtk_widget_show_all(window);   gtk_main();   return FALSE;}

35.字体选择:gtk\_font\_selection\_dialog\_new

/* 选择字体 fontsel.c */#include <gtk/gtk.h>void on_font_select_ok (GtkWidget *button,GtkFontSelectionDialog *fs){   GtkWidget *dialog;   gchar message[1024];   gchar *s = gtk_font_selection_dialog_get_font_name(fs);   sprintf(message,"你选择的字体是:%s \n",s);   dialog = gtk_message_dialog_new(NULL,            GTK_DIALOG_DESTROY_WITH_PARENT,            GTK_MESSAGE_INFO,            GTK_BUTTONS_OK,            message,            NULL);   g_free(s);   gtk_widget_destroy(GTK_WIDGET(fs));   gtk_dialog_run(GTK_DIALOG(dialog));   gtk_widget_destroy(dialog);}void on_button_clicked (GtkWidget *button,gpointer userdata){   GtkWidget* dialog ;    dialog = gtk_font_selection_dialog_new("请选择一种字体:");   gtk_window_set_position(GTK_WINDOW(dialog),GTK_WIN_POS_CENTER);   gtk_signal_connect(GTK_OBJECT(dialog),"destroy",         GTK_SIGNAL_FUNC(gtk_widget_destroy),&dialog);   gtk_signal_connect(GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(dialog)->ok_button),         "clicked",GTK_SIGNAL_FUNC(on_font_select_ok),         GTK_FONT_SELECTION_DIALOG(dialog));    gtk_signal_connect_object(GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(dialog)->cancel_button),         "clicked",GTK_SIGNAL_FUNC(gtk_widget_destroy),         GTK_OBJECT(dialog));    gtk_widget_show(dialog);}int main ( int argc , char* argv[]){   GtkWidget *window;   GtkWidget *button;    gtk_init(&argc,&argv);    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);   g_signal_connect(G_OBJECT(window),"delete_event",         G_CALLBACK(gtk_main_quit),NULL);   gtk_window_set_title(GTK_WINDOW(window),"字体选择功能实现");   gtk_window_set_default_size(GTK_WINDOW(window),500,100);   //gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);   gtk_container_set_border_width(GTK_CONTAINER(window),40);    button = gtk_button_new_with_label("按下此按钮来选择字体");   g_signal_connect(G_OBJECT(button),"clicked",         G_CALLBACK(on_button_clicked),NULL);   gtk_container_add(GTK_CONTAINER(window),button);   gtk_widget_show(button);     gtk_widget_show(window);   gtk_main();   return FALSE;}

36.几个画图的骚操作:gtk\_drawing\_area_new

先给出三个例子的效果:

代码1效果

代码2效果

代码3效果

代码1

/* 绘图软件 brush.c */#include <gtk/gtk.h>#include <stdlib.h>#include <stdio.h>static GtkWidget *window = NULL;static GdkPixmap *pixmap = NULL; char FN[250]={"layer.txt"};int nx=300;int nz=300; static gboolean scribble_configure_event (GtkWidget *widget,GdkEventConfigure *event,gpointer data){   if (pixmap)   g_object_unref (G_OBJECT (pixmap));   pixmap = gdk_pixmap_new (widget->window,   widget->allocation.width,   widget->allocation.height,-1);   gdk_draw_rectangle (pixmap,widget->style->white_gc,                        TRUE,0,0,widget->allocation.width,                        widget->allocation.height);   return TRUE;}static gboolean scribble_expose_event (GtkWidget *widget,GdkEventExpose *event,gpointer data){   gdk_draw_drawable (widget->window,                        widget->style->fg_gc[GTK_WIDGET_STATE (widget)],                        pixmap,                        event->area.x, event->area.y,                        event->area.x, event->area.y,                        event->area.width, event->area.height);   return FALSE;}static void draw_brush (GtkWidget *widget, gdouble x, gdouble y){   GdkRectangle update_rect;   update_rect.x = x - 3;   update_rect.y = y - 3;   update_rect.width = 6;   update_rect.height = 6;   gdk_draw_rectangle (pixmap,                        widget->style->black_gc,                        TRUE,                        update_rect.x, update_rect.y,                        update_rect.width, update_rect.height);                        gdk_window_invalidate_rect (widget->window,                        &update_rect,                        FALSE);}static gboolean scribble_button_press_event (GtkWidget *widget,GdkEventButton *event,gpointer data){   if (pixmap == NULL)      return FALSE;   if (event->button == 1)   {      draw_brush (widget, event->x, event->y);      printf("x=%.2f, z=%.2f\n", event->x, event->y*5.0);   }   return TRUE;}static gboolean scribble_motion_notify_event (GtkWidget *widget,GdkEventMotion *event,gpointer data){   int x, y;   GdkModifierType state;   if (pixmap == NULL)      return FALSE;   gdk_window_get_pointer (event->window, &x, &y, &state);   if (state & GDK_BUTTON1_MASK)      draw_brush (widget, x, y);   return TRUE;}static gboolean checkerboard_expose (GtkWidget *da, GdkEventExpose *event,gpointer data){   gint i, j, xcount, ycount;   GdkGC *gc1, *gc2;   GdkColor color;#define CHECK_SIZE 10#define SPACING 2   gc1 = gdk_gc_new (da->window);   color.red = 30000;   color.green = 0;   color.blue = 30000;   gdk_gc_set_rgb_fg_color (gc1, &color);   gc2 = gdk_gc_new (da->window);   color.red = 65535;   color.green = 65535;   color.blue = 65535;   gdk_gc_set_rgb_fg_color (gc2, &color);   xcount = 0;   i = SPACING;   while (i < da->allocation.width)   {      j = SPACING;      ycount = xcount % 2;      while (j < da->allocation.height)      {         GdkGC *gc;         if (ycount % 2)            gc = gc1;         else            gc = gc2;         gdk_draw_rectangle (da->window, gc, TRUE,                              i, j, CHECK_SIZE, CHECK_SIZE);         j += CHECK_SIZE + SPACING;         ++ycount;      }      i += CHECK_SIZE + SPACING;      ++xcount;   }   g_object_unref (G_OBJECT (gc1));   g_object_unref (G_OBJECT (gc2));   return TRUE;}void writeTXT( GtkWidget *widget, gpointer data ){       FILE *fp=fopen(FN,"w");       fprintf(fp,"rongtao\n");       fclose(fp);       g_print ("Write txt done.\n ");       gtk_main_quit ();}int main (int argc,char* argv[]){   GtkWidget *frame;   GtkWidget *vbox;   GtkWidget *da;   GtkWidget *label;    GtkWidget *button;    gtk_init(&argc,&argv);    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);   gtk_window_set_title (GTK_WINDOW (window), "绘图软件");   g_signal_connect (G_OBJECT(window), "delete_event",         G_CALLBACK (gtk_main_quit), NULL);   gtk_container_set_border_width (GTK_CONTAINER (window), 10);    vbox = gtk_vbox_new (FALSE, 8);   gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);   gtk_container_add (GTK_CONTAINER (window), vbox);    label = gtk_label_new (NULL);   gtk_label_set_markup (GTK_LABEL (label),"<u>绘图区域</u>");   gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);    frame = gtk_frame_new (NULL);   gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);   gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);    da = gtk_drawing_area_new ();   gtk_widget_set_size_request (da, nx, nz);   gtk_container_add (GTK_CONTAINER (frame), da);    g_signal_connect (da, "expose_event",         G_CALLBACK (scribble_expose_event), NULL);   g_signal_connect (da, "configure_event",         G_CALLBACK (scribble_configure_event), NULL);   g_signal_connect (da, "motion_notify_event",         G_CALLBACK (scribble_motion_notify_event), NULL);   g_signal_connect (da, "button_press_event",         G_CALLBACK (scribble_button_press_event), NULL);    gtk_widget_set_events (da, gtk_widget_get_events (da)                           | GDK_LEAVE_NOTIFY_MASK                           | GDK_BUTTON_PRESS_MASK                           | GDK_POINTER_MOTION_MASK                           | GDK_POINTER_MOTION_HINT_MASK);       button = gtk_button_new_with_label ("Hello");      g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (writeTXT), NULL);      gtk_box_pack_start (GTK_BOX(vbox), button, TRUE, TRUE, 0);     gtk_widget_show_all (window);   gtk_main();   return FALSE;}

代码2

#include <gtk/gtk.h> static GdkPixmap *pixmap = NULL;GdkGC *my_gc_red;GdkColor color; int my_configure_event(GtkWidget *widget , GdkEventConfigure *event){      if(pixmap)          g_object_unref(pixmap);      pixmap = gdk_pixmap_new(widget->window ,                   widget->allocation.width ,                   widget->allocation.height ,                   -1);      gdk_draw_rectangle(pixmap , widget->style->white_gc ,                   TRUE , 0 , 0 ,                   widget->allocation.width ,                   widget->allocation.height);       my_gc_red = gdk_gc_new(widget->window);      color.red = 30000;      color.green = 0;      color.blue = 30000;      gdk_gc_set_rgb_fg_color(my_gc_red , &color);           return 0;} int my_expose_event(GtkWidget *widget , GdkEventExpose *event , gpointer data){      gdk_draw_drawable(widget->window ,               widget->style->fg_gc[GTK_WIDGET_STATE(widget)] ,              pixmap , 0 , 0 , 0 , 0 ,               widget->allocation.width ,               widget->allocation.height);           return 0;} int my_draw(GtkWidget *widget , double x , double y , int type){      switch(type){          case 1:              gdk_draw_rectangle(pixmap ,                       widget->style->black_gc ,                       FALSE ,                           x , y , 10 , 10);              gtk_widget_queue_draw_area(widget ,                           x , y , 10 , 10);              break;          case 2:              gdk_draw_rectangle(pixmap ,                       my_gc_red ,                       TRUE ,                           x , y , 15 , 15);              gtk_widget_queue_draw_area(widget ,                           x , y , 15 , 15);              break;          case 3:              gdk_draw_line(pixmap , my_gc_red ,                       x , y , x + 15 , y - 15);              gtk_widget_queue_draw_area(widget ,                       x , y - 15 , 15 , 15);              break;          default:              printf("....\n");              break;      }          return 0;}int my_button_press_event(GtkWidget *widget , GdkEventButton *event){      my_draw(widget , event->x , event->y , event->button);          printf("x=%lf y=%lf\n" , event->x , event->y);       return 0;    }int my_clear(GtkWidget *widget , GtkWidget *area){      gdk_draw_rectangle(pixmap ,               area->style->white_gc ,               TRUE , 0 , 0 ,               area->allocation.width ,               area->allocation.height);      gtk_widget_queue_draw(area);       return 0;}int my_quit(GtkWidget *widget , gpointer data){      gtk_main_quit();          return 0;} int main(int argc , char *argv[]){      GtkWidget *window;      GtkWidget *drawing_area;      GtkWidget *vbox;      GtkWidget *bt_clear;      GtkWidget *bt_quit;       gtk_init(&argc , &argv);          window = gtk_window_new(GTK_WINDOW_TOPLEVEL);      gtk_widget_set_name(window , "Test drawing_area");      gtk_widget_set_size_request(window , 300 , 200);      gtk_container_set_border_width(GTK_CONTAINER(window) , 2);      gtk_window_set_resizable(GTK_WINDOW(window) , FALSE);       vbox = gtk_vbox_new(FALSE , 0);      gtk_container_add(GTK_CONTAINER(window) , vbox);      gtk_widget_show(vbox);          g_signal_connect(G_OBJECT(window) , "destroy" ,               G_CALLBACK(my_quit) , NULL);       drawing_area = gtk_drawing_area_new();      gtk_box_pack_start(GTK_BOX(vbox) , drawing_area , TRUE , TRUE , 0);      gtk_widget_show(drawing_area);      g_signal_connect(G_OBJECT(drawing_area) , "configure_event" ,               G_CALLBACK(my_configure_event) , NULL);      g_signal_connect(G_OBJECT(drawing_area) , "expose_event" ,               G_CALLBACK(my_expose_event) , NULL);      g_signal_connect(G_OBJECT(drawing_area) , "button_press_event" ,               G_CALLBACK(my_button_press_event) , NULL);      gtk_widget_set_events(drawing_area , GDK_BUTTON_PRESS_MASK);          bt_clear = gtk_button_new_with_label("clear");      gtk_box_pack_start(GTK_BOX(vbox) , bt_clear , FALSE , FALSE , 0);      g_signal_connect(G_OBJECT(bt_clear) , "clicked" ,               G_CALLBACK(my_clear) , drawing_area);      gtk_widget_show(bt_clear);          bt_quit = gtk_button_new_with_label("quit");      gtk_box_pack_start(GTK_BOX(vbox) , bt_quit , FALSE , FALSE , 0);      g_signal_connect(G_OBJECT(bt_quit) , "clicked" ,               G_CALLBACK(my_quit) , window);      gtk_widget_show(bt_quit);       gtk_widget_show(window);       gtk_main();       return 0;}

代码3

/* GTK - The GIMP Toolkit* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald** This library is free software; you can redistribute it and/or* modify it under the terms of the GNU Lesser General Public* License as published by the Free Software Foundation; either* version 2 of the License, or (at your option) any later version.** This library is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.   See the GNU* Lesser General Public License for more details.** You should have received a copy of the GNU Lesser General Public* License along with this library; if not, write to the* Free Software Foundation, Inc., 59 Temple Place - Suite 330,* Boston, MA 02111-1307, USA.*//** Modified by the GTK+ Team and others 1997-2000.   See the AUTHORS* file for a list of people on the GTK+ Team.   See the ChangeLog* files for a list of changes.   These files are distributed with* GTK+ at ftp://ftp.gtk.org/pub/gtk/. *///#include <config.h>#include <stdio.h>#include "gtk/gtk.h"/* Backing pixmap for drawing area */static GdkPixmap *pixmap = NULL;/* Information about cursor */static gint cursor_proximity = TRUE;static gdouble cursor_x;static gdouble cursor_y;/* Unique ID of current device */static GdkDevice *current_device;/* Erase the old cursor, and/or draw a new one, if necessary */static voidupdate_cursor (GtkWidget *widget,   gdouble x, gdouble y){   static gint cursor_present = 0;   gint state = !current_device->has_cursor && cursor_proximity;   if (pixmap != NULL)     {       if (cursor_present && (cursor_present != state ||         x != cursor_x || y != cursor_y)){    gdk_draw_drawable (widget->window,         widget->style->fg_gc[GTK_WIDGET_STATE (widget)],         pixmap,         cursor_x - 5, cursor_y - 5,         cursor_x - 5, cursor_y - 5,         10, 10);}       cursor_present = state;       cursor_x = x;       cursor_y = y;       if (cursor_present){    gdk_draw_rectangle (widget->window,          widget->style->black_gc,          TRUE,          cursor_x - 5, cursor_y -5,          10, 10);}     }}/* Create a new backing pixmap of the appropriate size */static gintconfigure_event (GtkWidget *widget, GdkEventConfigure *event){   if (pixmap)     g_object_unref (pixmap);   pixmap = gdk_pixmap_new(widget->window,      widget->allocation.width,      widget->allocation.height,      -1);   gdk_draw_rectangle (pixmap,         widget->style->white_gc,         TRUE,         0, 0,         widget->allocation.width,         widget->allocation.height);   return TRUE;}/* Refill the screen from the backing pixmap */static gintexpose_event (GtkWidget *widget, GdkEventExpose *event){   gdk_draw_drawable (widget->window,        widget->style->fg_gc[GTK_WIDGET_STATE (widget)],        pixmap,        event->area.x, event->area.y,        event->area.x, event->area.y,        event->area.width, event->area.height);   return FALSE;}/* Draw a rectangle on the screen, size depending on pressure,    and color on the type of device */static voiddraw_brush (GtkWidget *widget, GdkInputSource source,      gdouble x, gdouble y, gdouble pressure){   GdkGC *gc;   GdkRectangle update_rect;   switch (source)     {     case GDK_SOURCE_MOUSE:       gc = widget->style->dark_gc[GTK_WIDGET_STATE (widget)];       break;     case GDK_SOURCE_PEN:       gc = widget->style->black_gc;       break;     case GDK_SOURCE_ERASER:       gc = widget->style->white_gc;       break;     default:       gc = widget->style->light_gc[GTK_WIDGET_STATE (widget)];     }   update_rect.x = x - 10 * pressure;   update_rect.y = y - 10 * pressure;   update_rect.width = 20 * pressure;   update_rect.height = 20 * pressure;   gdk_draw_rectangle (pixmap, gc, TRUE,         update_rect.x, update_rect.y,         update_rect.width, update_rect.height);   gtk_widget_queue_draw_area (widget,          update_rect.x, update_rect.y,          update_rect.width, update_rect.height);   gdk_window_process_updates (widget->window, TRUE);}static guint32 motion_time;static voidprint_axes (GdkDevice *device, gdouble *axes){   int i;     if (axes)     {       g_print ("%s ", device->name);             for (i=0; i<device->num_axes; i++)             g_print ("%g ", axes[i]);       g_print ("\n");     }}static gintbutton_press_event (GtkWidget *widget, GdkEventButton *event){   current_device = event->device;   cursor_proximity = TRUE;   if (event->button == 1 && pixmap != NULL)     {       gdouble pressure = 0.5;       print_axes (event->device, event->axes);       gdk_event_get_axis ((GdkEvent *)event, GDK_AXIS_PRESSURE, &pressure);       draw_brush (widget, event->device->source, event->x, event->y, pressure);             motion_time = event->time;     }   update_cursor (widget, event->x, event->y);   return TRUE;}static gintkey_press_event (GtkWidget *widget, GdkEventKey *event){   if ((event->keyval >= 0x20) && (event->keyval <= 0xFF))     printf("I got a %c\n", event->keyval);   else     printf("I got some other key\n");   return TRUE;}static gintmotion_notify_event (GtkWidget *widget, GdkEventMotion *event){   GdkTimeCoord **events;   int n_events;   int i;   current_device = event->device;   cursor_proximity = TRUE;   if (event->state & GDK_BUTTON1_MASK && pixmap != NULL)     {       if (gdk_device_get_history (event->device, event->window,        motion_time, event->time,       &events, &n_events)){    for (i=0; i<n_events; i++)      {        double x = 0, y = 0, pressure = 0.5;        gdk_device_get_axis (event->device, events[i]->axes, GDK_AXIS_X, &x);        gdk_device_get_axis (event->device, events[i]->axes, GDK_AXIS_Y, &y);        gdk_device_get_axis (event->device, events[i]->axes, GDK_AXIS_PRESSURE, &pressure);        draw_brush (widget,   event->device->source, x, y, pressure);        print_axes (event->device, events[i]->axes);      }    gdk_device_free_history (events, n_events);}       else{    double pressure = 0.5;    gdk_event_get_axis ((GdkEvent *)event, GDK_AXIS_PRESSURE, &pressure);    draw_brush (widget,   event->device->source, event->x, event->y, pressure);}       motion_time = event->time;     }   if (event->is_hint)     gdk_device_get_state (event->device, event->window, NULL, NULL);   print_axes (event->device, event->axes);   update_cursor (widget, event->x, event->y);   return TRUE;}/* We track the next two events to know when we need to draw a    cursor */static gintproximity_out_event (GtkWidget *widget, GdkEventProximity *event){   cursor_proximity = FALSE;   update_cursor (widget, cursor_x, cursor_y);   return TRUE;}static gintleave_notify_event (GtkWidget *widget, GdkEventCrossing *event){   cursor_proximity = FALSE;   update_cursor (widget, cursor_x, cursor_y);   return TRUE;}voidinput_dialog_destroy (GtkWidget *w, gpointer data){   *((GtkWidget **)data) = NULL;}voidcreate_input_dialog (void){   static GtkWidget *inputd = NULL;   if (!inputd)     {       inputd = gtk_input_dialog_new ();       g_signal_connect (inputd, "destroy",            G_CALLBACK (input_dialog_destroy), &inputd);       g_signal_connect_swapped (GTK_INPUT_DIALOG (inputd)->close_button,            "clicked",            G_CALLBACK (gtk_widget_hide),            inputd);       gtk_widget_hide (GTK_INPUT_DIALOG (inputd)->save_button);       gtk_widget_show (inputd);     }   else     {       if (!GTK_WIDGET_MAPPED(inputd))            gtk_widget_show(inputd);       else            gdk_window_raise(inputd->window);     }}voidquit (void){   gtk_main_quit ();}intmain (int argc, char *argv[]){   GtkWidget *window;   GtkWidget *drawing_area;   GtkWidget *vbox;   GtkWidget *button;   gtk_init (&argc, &argv);   current_device = gdk_device_get_core_pointer ();   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);   gtk_widget_set_name (window, "Test Input");       gtk_widget_set_size_request(window , 300 , 320);      gtk_container_set_border_width(GTK_CONTAINER(window) , 2);      gtk_window_set_resizable(GTK_WINDOW(window) , FALSE);    vbox = gtk_vbox_new (FALSE, 0);   gtk_container_add (GTK_CONTAINER (window), vbox);   gtk_widget_show (vbox);   g_signal_connect (window, "destroy",       G_CALLBACK (quit), NULL);   /* Create the drawing area */   drawing_area = gtk_drawing_area_new ();   gtk_widget_set_size_request (drawing_area, 200, 200);   gtk_box_pack_start (GTK_BOX (vbox), drawing_area, TRUE, TRUE, 0);   gtk_widget_show (drawing_area);   /* Signals used to handle backing pixmap */   g_signal_connect (drawing_area, "expose_event",       G_CALLBACK (expose_event), NULL);   g_signal_connect (drawing_area, "configure_event",       G_CALLBACK (configure_event), NULL);   /* Event signals */   g_signal_connect (drawing_area, "motion_notify_event",       G_CALLBACK (motion_notify_event), NULL);   g_signal_connect (drawing_area, "button_press_event",       G_CALLBACK (button_press_event), NULL);   g_signal_connect (drawing_area, "key_press_event",       G_CALLBACK (key_press_event), NULL);   g_signal_connect (drawing_area, "leave_notify_event",       G_CALLBACK (leave_notify_event), NULL);   g_signal_connect (drawing_area, "proximity_out_event",       G_CALLBACK (proximity_out_event), NULL);   gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK     | GDK_LEAVE_NOTIFY_MASK     | GDK_BUTTON_PRESS_MASK     | GDK_KEY_PRESS_MASK     | GDK_POINTER_MOTION_MASK     | GDK_POINTER_MOTION_HINT_MASK     | GDK_PROXIMITY_OUT_MASK);   /* The following call enables tracking and processing of extension      events for the drawing area */   gtk_widget_set_extension_events (drawing_area, GDK_EXTENSION_EVENTS_ALL);   GTK_WIDGET_SET_FLAGS (drawing_area, GTK_CAN_FOCUS);   gtk_widget_grab_focus (drawing_area);   /* .. And create some buttons */   button = gtk_button_new_with_label ("Input Dialog");   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);   g_signal_connect (button, "clicked",       G_CALLBACK (create_input_dialog), NULL);   gtk_widget_show (button);   button = gtk_button_new_with_label ("Quit");   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);   g_signal_connect_swapped (button, "clicked",        G_CALLBACK (gtk_widget_destroy),        window);   gtk_widget_show (button);   gtk_widget_show (window);   gtk_main ();   return 0;}

最后寄语

希望在座各位在学习的道路上越走越远,完成从入门到放弃的质的转变。

本原创文章未经允许不得转载 | 当前页面:纳须弥 » GTK从入门到放弃

评论