GTK 对话框

对话框       

对话框是一类GtkWindow,它用于提供顶层窗口。它可以为用户提供消息,可以获得用户信息,或者提供一些简短的动作。
        对话款构件被一个水平分割线分隔成两半。上半部放置的是用户界面的主要部分。下半部被称为动作区域,它包括一系列的按钮。当点击,每个按钮会发出一个唯一标识的信号,告诉程序员哪个按钮被点击了。
        一般来说,对话框构件可以被看做一个窗口,因为它从GtkWindow类继承而来。然而,当您有多个窗口时,父亲-孩子的关系应该建立在对话框和顶层窗口之间,对话框注定是顶层窗口的补充。
[cpp] view plain copy print ?
  1. typedef struct  
  2.        {  
  3.            GtkWidget *vbox;  
  4.            GtkWidget *action_area;  
  5.        } GtkDialog;  

 GtkDialog提供了两个公共成员,包括一个横向按钮的盒子,称为动作区域,以及一个纵向盒子。动作区域包括所有的按钮,在对话框下部排列着。通过GtkHbuttonBox,您可以手工添加按钮,但是通常您应该使用GtkDialog提供的函数来添加动作区域构件。

具体看下面一个简单的例子:
[cpp] view plain copy print ?
  1. /*File:dialogs.c 
  2.  *Date:2013-12-16 
  3.  *Author:sjin 
  4.  *Mail:[email protected] 
  5.  */  
  6.   
  7. #include <gtk/gtk.h>  
  8.   
  9. //无模式窗口  
  10. //#define SCHEMALESS_WINDOW  
  11.   
  12. void button_click(GtkWidget *widget,GtkWindow *parent)  
  13. {  
  14.     GtkWidget *dialog;  
  15.     GtkWidget *label;  
  16.     GtkWidget *image;  
  17.     GtkWidget *hbox;  
  18.   
  19.     /*GtkWidget * gtk_dialog_new_with_buttons( 
  20.      *           const gchar *title,对话框标题 
  21.      *           GtkWindow *parent,对话框父窗口 
  22.      *           GtkDialogFlags flags, 
  23.      *           const gchar *first_button_text,动作区域按钮列表 
  24.      *           ...); 
  25.      *           falgs:GTK_DIALOG_MODAL:对话框始终保持在父窗口的上部,直到关闭,防止父窗口交互 
  26.      *                 GTK_DIALOG_DESTROY_WITH_PARENT:父窗口销毁,对话框也销毁 
  27.      *                 GTK_DIALOG_NO_SEPARATOR:不显示分割线 
  28.      * 
  29.      * */  
  30. #ifndef SCHEMALESS_WINDOW  
  31.     dialog = gtk_dialog_new_with_buttons("我的第一个对话框",parent,GTK_DIALOG_MODAL,GTK_STOCK_OK,GTK_RESPONSE_OK,NULL);  
  32. #else  
  33.     dialog = gtk_dialog_new_with_buttons("我的第一个对话框",parent,GTK_DIALOG_DESTROY_WITH_PARENT,GTK_STOCK_OK,GTK_RESPONSE_OK,NULL);  
  34. #endif  
  35.     /*设置分割线是否隐藏:FALSE:隐藏。*/  
  36.     gtk_dialog_set_has_separator(GTK_DIALOG(dialog),FALSE);  
  37.     label = gtk_label_new("the button was clicked!");  
  38.   
  39.     /*GtkWidget * gtk_image_new_from_stock(const gchar *stock_id, 
  40.      *            GtklconSize size) 
  41.      * 创建一个预制的Gtkimage构件,当载入一个图片时,还需要指定图片的 
  42.      *大小,如果图片没有找到,GTK会自动寻找一个自制的图标 
  43.      * size :参数 GTK_ICON_SIZE_INVALID:未指定大小 
  44.      *            GTK_ICON_SIZE_MENU : 16X16像素 
  45.      *            GTK_ICON_SIZE_SMALL_TOOLBAR: 18X18像素 
  46.      *            GTK_ICON_SIZE_LARGE_TOOLBAR: 24X24像素 
  47.      *            GTK_ICON_SIZE_BUTTON: 24X24像素 
  48.      *            GTK_ICON_SIZE_DND: 32X32像素 
  49.      *            GTK_ICON_SIZE_DIALOG: 48X48像素 
  50.      *还有另外两个加载图片的函数 
  51.      *GtkWidget*gtk_image_new_from_file(const gchar *filename) 
  52.      *GtkWidget *gtk_image_new_from_pixbuf(GdkPixbuf *pixbuf) 
  53.      * */  
  54.     image = gtk_image_new_from_stock(GTK_STOCK_DIALOG_INFO,GTK_ICON_SIZE_DIALOG);  
  55.       
  56.     hbox = gtk_hbox_new(FALSE,5);  
  57.     gtk_container_set_border_width(GTK_CONTAINER(hbox),10);  
  58.     gtk_box_pack_start_defaults(GTK_BOX(hbox),image);  
  59.     gtk_box_pack_start_defaults(GTK_BOX(hbox),label);  
  60.     gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox),hbox);  
  61.     gtk_widget_show_all(dialog);  
  62.   
  63. #ifndef SCHEMALESS_WINDOW  
  64.     /*显示对话框*/  
  65.     gtk_dialog_run(GTK_DIALOG(dialog));  
  66.     gtk_widget_destroy(dialog);  
  67. #else  
  68.     g_signal_connect(G_OBJECT(dialog),"response",G_CALLBACK(gtk_widget_destroy),NULL);  
  69. #endif  
  70.   
  71. }  
  72.   
  73. int main(int argc, char*argv[])  
  74. {  
  75.     GtkWidget *window;  
  76.     GtkWidget *button;  
  77.   
  78.     //初始化GTK  
  79.     gtk_init(&argc,&argv);  
  80.     //创建最上层主窗口  
  81.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
  82.     //连接信号"delete_event",使得窗口关闭时发生  
  83.     g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);  
  84.     //设置窗口标题      
  85.     gtk_window_set_title(GTK_WINDOW(window),"对话框练习");  
  86.     //设定窗口的默认宽高  
  87.     //gtk_window_set_default_size(GTK_WINDOW(window),200,300);  
  88.     //设定窗口的位置,让窗口总在最前端  
  89.     gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);  
  90.     //设定容器边框的宽度  
  91.     gtk_container_set_border_width(GTK_CONTAINER(window),20);  
  92.   
  93.     //创建按钮  
  94.     button = gtk_button_new_with_mnemonic("clicked me");  
  95.     gtk_container_add(GTK_CONTAINER(window),button);  
  96.     g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(button_click),(gpointer)window);  
  97.     gtk_widget_show(button);  
  98.   
  99.     gtk_widget_show_all(window);  
  100.     gtk_main();  
  101.     return 0;  
  102. }  


编译时有两种模式,-D SCHEMALESS_WINDOW 是无模式窗口,和模式窗口(不能和父窗口交互,永远在父窗口上面)。
运行:
GTK 对话框_第1张图片

另外一个对话框的应用:
[cpp] view plain copy print ?
  1. /*File:dialogs3.c 
  2.  *Date:2013-12-16 
  3.  *Author:sjin 
  4.  *Mail:[email protected] 
  5.  */  
  6.   
  7. #include <gtk/gtk.h>  
  8.   
  9.   
  10. int main(int argc, char*argv[])  
  11. {  
  12.     GtkWidget *dialog;  
  13.     GtkWidget *table;  
  14.     GtkWidget *user,*real,*home,*host;  
  15.     GtkWidget *lbl1,*lbl2,*lbl3,*lbl4;  
  16.     gint result;  
  17.   
  18.     //初始化GTK  
  19.     gtk_init(&argc,&argv);  
  20.   
  21.     /*GtkWidget * gtk_dialog_new_with_buttons( 
  22.      *           const gchar *title,对话框标题 
  23.      *           GtkWindow *parent,对话框父窗口 
  24.      *           GtkDialogFlags flags, 
  25.      *           const gchar *first_button_text,动作区域按钮列表 
  26.      *           ...); 
  27.      *           falgs:GTK_DIALOG_MODAL:对话框始终保持在父窗口的上部,直到关闭,防止父窗口交互 
  28.      *                 GTK_DIALOG_DESTROY_WITH_PARENT:父窗口销毁,对话框也销毁 
  29.      *                 GTK_DIALOG_NO_SEPARATOR:不显示分割线 
  30.      * 
  31.      * */  
  32.     dialog = gtk_dialog_new_with_buttons("用户信息编辑窗口",NULL,  
  33.                                          GTK_DIALOG_MODAL,  
  34.                                          GTK_STOCK_OK,GTK_RESPONSE_OK,  
  35.                                          GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,  
  36.                                          NULL);  
  37.     //设置缺省按钮  
  38.     gtk_dialog_set_default_response(GTK_DIALOG(dialog),GTK_RESPONSE_OK);  
  39.       
  40.     //创建4个条目,告诉用户输入的数据  
  41.     lbl1 = gtk_label_new("User Name");  
  42.     lbl2 = gtk_label_new("Real Name");  
  43.     lbl3 = gtk_label_new("Home Dir");  
  44.     lbl4 = gtk_label_new("Host Name");  
  45.     user = gtk_entry_new();  
  46.     real = gtk_entry_new();  
  47.     home = gtk_entry_new();  
  48.     host = gtk_entry_new();  
  49.   
  50.     //设置条目的缺省值  
  51.     gtk_entry_set_text(GTK_ENTRY(user),g_get_user_name());  
  52.     gtk_entry_set_text(GTK_ENTRY(real),g_get_real_name());  
  53.     gtk_entry_set_text(GTK_ENTRY(home),g_get_home_dir());  
  54.     gtk_entry_set_text(GTK_ENTRY(host),g_get_host_name());  
  55.   
  56.     //表组装  
  57.     table = gtk_table_new(4,2,FALSE);  
  58.     gtk_table_attach_defaults(GTK_TABLE(table),lbl1,0,1,0,1);  
  59.     gtk_table_attach_defaults(GTK_TABLE(table),lbl2,0,1,1,2);  
  60.     gtk_table_attach_defaults(GTK_TABLE(table),lbl3,0,1,2,3);  
  61.     gtk_table_attach_defaults(GTK_TABLE(table),lbl4,0,1,3,4);  
  62.     gtk_table_attach_defaults(GTK_TABLE(table),user,1,2,0,1);  
  63.     gtk_table_attach_defaults(GTK_TABLE(table),real,1,2,1,2);  
  64.     gtk_table_attach_defaults(GTK_TABLE(table),home,1,2,2,3);  
  65.     gtk_table_attach_defaults(GTK_TABLE(table),host,1,2,3,4);  
  66.   
  67.     gtk_table_set_row_spacings(GTK_TABLE(table),5);  
  68.     gtk_table_set_col_spacings(GTK_TABLE(table),5);  
  69.     gtk_container_set_border_width(GTK_CONTAINER(table),5);  
  70.     gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox),table);  
  71.     gtk_widget_show_all(dialog);  
  72.   
  73.     //运行和输出对话框  
  74.     result = gtk_dialog_run(GTK_DIALOG(dialog));  
  75.   
  76.     switch(result){  
  77.         case GTK_RESPONSE_NONE:  
  78.             /*-1 
  79.              * 对话框被窗口管理器销毁或通过gtk_widget_destroy()有其他程序销毁。 
  80.              * 如果构件没有设置一个相应标识,会返回它。 
  81.              */  
  82.             break;  
  83.         case GTK_RESPONSE_REJECT:  
  84.             /* -2 
  85.              * 这个标识没有和对话框内置的任何按钮相关联,可以任意使用它 
  86.              * */  
  87.             break;  
  88.         case GTK_RESPONSE_ACCEPT:  
  89.             /* -3 
  90.              * 这个标识没有和对话框内置的任何按钮相关联,可以任意使用它 
  91.              * */  
  92.             break;  
  93.         case GTK_RESPONSE_DELETE_EVENT:  
  94.             /* -4 
  95.              * 每个对话框都会自动连接到delete-event信号,当gtk_dialog_run() 
  96.              * 运行是,这个标识会被返回,而且delete-event会被终止、不会像 
  97.              * 往常那样销毁窗口 
  98.              * */  
  99.             break;  
  100.               
  101.         case GTK_RESPONSE_OK:  
  102.             /* -5 
  103.              * GTK_STOCK_OK 被点击 
  104.              */  
  105.             g_print("User Name:\t%s\n",gtk_entry_get_text(GTK_ENTRY(user)));  
  106.             g_print("Real Name:\t%s\n",gtk_entry_get_text(GTK_ENTRY(real)));  
  107.             g_print("Home Dir:\t%s\n",gtk_entry_get_text(GTK_ENTRY(home)));  
  108.             g_print("Host Name:\t%s\n",gtk_entry_get_text(GTK_ENTRY(host)));  
  109.   
  110.             break;  
  111.         case GTK_RESPONSE_CANCEL:  
  112.             /*-6 
  113.              * GTK_STOCK_CANCEL被点击 
  114.              * */  
  115.             g_print("cancel is press!\n");  
  116.   
  117.             break;  
  118.         case GTK_RESPONSE_CLOSE:  
  119.             /* -7 
  120.              *GTK_STOCK_CLOSE被点击 
  121.              */  
  122.             break;  
  123.         case GTK_RESPONSE_YES:  
  124.             /* -8 
  125.              *GTK_STOCK_YES被点击 
  126.              */  
  127.             break;  
  128.         case GTK_RESPONSE_NO:  
  129.             /* -9 
  130.              *GTK_STOCK_NO被点击 
  131.              */  
  132.             break;  
  133.         case GTK_RESPONSE_APPLY:  
  134.             /* -10 
  135.              *GTK_STOCK_APPLY被点击 
  136.              */  
  137.             break;  
  138.         case GTK_RESPONSE_HELP:  
  139.             /* -11 
  140.              *GTK_STOCK_HELP被点击 
  141.              */  
  142.             break;  
  143.         default:  
  144.             g_print("something wrong!\n");  
  145.   
  146.             break;  
  147.     }  
  148.   
  149.     gtk_widget_destroy(dialog);  
  150.     //gtk_main();  
  151.     return 0;  
  152. }  
运行结果如下:
GTK 对话框_第2张图片

消息对话框
        消息对话框用于下列四种消息:一般信息、错误信息、警告和问题。对话框的类型决定了显示的图表类型、对话框标题和添加的按钮。
        还有一种通用类型的对话框,它对内容没有任何假设。在多数情况下,您不需要使用它,因为上述四种类型基本上满足了大部分需求。
        重新创建GtkMessageDialog构件是很容易的。前面的两个例子实现了一个简单的消息对话框,但是GtkMessageDialog已经提供了这个功能,因此您不需要重新创建这个构件。使用GtkMessageDialog节省了代码,而且避免您反复重新创建这种构件,其实大部分应用程序反复使用GtkMessageDialog。它还为所有GTK+应用程序提供了一个统一的外观。
   具体看下面的示例:
GTK 对话框_第3张图片
具体代码如下:
[cpp] view plain copy print ?
  1. /*File: message.c 
  2.  *Date:2013-12-21 
  3.  *Author:sjin 
  4.  *Mail:[email protected] 
  5.  */  
  6.   
  7. #include <gtk/gtk.h>  
  8.   
  9. static void on_button_clicked(GtkWidget* button,gpointer data)  
  10. {  
  11.     GtkWidget* dialog;  
  12.     GtkMessageType type;  
  13.     gchar* message;  
  14.     switch((int)data){  
  15.     case 1:  
  16.         message = "这是个信息提示对话框.";  
  17.         type = GTK_MESSAGE_INFO;  
  18.         break;  
  19.     case 2:  
  20.         message = "这是个错误提示对话框";  
  21.         type = GTK_MESSAGE_ERROR;  
  22.         break;  
  23.     case 3:  
  24.         message = "这是个问题提示对话框";  
  25.         type = GTK_MESSAGE_QUESTION;  
  26.         break;  
  27.     case 4:  
  28.         message = "这是个警告提示对话框";  
  29.         type = GTK_MESSAGE_WARNING;  
  30.         break;  
  31.     default:  
  32.         break;  
  33.     }  
  34.     /*GtkWidget * gtk_message_dialog_new(GtkWindow *parent, 
  35.      *                 GtkDialogFlags flags, 
  36.      *                 GtkMessageType type, 
  37.      *                 GtkButtonsType buttons, 
  38.      *                 const gchar * message_format, 
  39.      *                 ...); 
  40.      *   type :枚举的五个可能值: 
  41.      *        GTK_MESSAGE_INFO:显示用户的一般性消息 
  42.      *        GTK_MESSAGE_WARNING:一个警告信息,表示发生了非致命的错误 
  43.      *        GTK_MESSAGE_QUESTION:询问用户一个问题,用户必须做出选择。 
  44.      *        GTK_MESSAGE_ERROR:警告信息,标识发生了一个致命的错误 
  45.      *        GTK_MESSAGE_OTHER:一般类型的消息 
  46.      *  buttons:显示什么类型的按钮 
  47.      *        GTK_BUTTONS_NONE:不添加任何按钮。 
  48.      *        GTK_BUTTONS_OK:添加GTK_STOCK_OK按钮 
  49.      *        GTK_BUTTONS_CLOSE:添加GTK_STOCK_CLOSE按钮 
  50.      *        GTK_BUTTONS_CANCEL:添加GTK_STOCK_CANCEL按钮 
  51.      *        GTK_BUTTONS_YES_NO:添加GTK_STOCK_YES和GTK_STOCK_NO 
  52.      *        GTK_BUTTONS_OK_CANCEL: ... 
  53.      *   最后一个参数是显示对话框中的内容 
  54.      * 
  55.      *   void gtk_message_dialog_set_format_secondary_text(GtkMessageDialog*dialog, 
  56.      *                          const gchar *message_format, 
  57.      *                          ...); 
  58.      *   为消息对话框添加第二段文本,他会导致第一个文本被设置成粗体。这个功能 
  59.      *   非常有用,它允许您在第一段文字中写一个简短的概要,在第二段文本中详细 
  60.      *   描述。通过gtk_message_set_format_secondary_markup()来设置文本格式 
  61.      * */  
  62.   
  63.     dialog = gtk_message_dialog_new(NULL,GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,type,GTK_BUTTONS_OK,message);  
  64.     gtk_dialog_run(GTK_DIALOG(dialog));  
  65.     gtk_widget_destroy(dialog);  
  66. }  
  67.   
  68. int main(int argc,char* argv[])  
  69. {  
  70.     GtkWidget* window;  
  71.     GtkWidget* frame;  
  72.     GtkWidget* box;  
  73.     GtkWidget* button1;  
  74.     GtkWidget* button2;  
  75.     GtkWidget* button3;  
  76.     GtkWidget* button4;  
  77.   
  78.     gtk_init(&argc,&argv);  
  79.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
  80.     gtk_window_set_title(GTK_WINDOW(window),"创建消息框");  
  81.     g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);  
  82.     gtk_container_set_border_width(GTK_CONTAINER(window),20);  
  83.     frame = gtk_frame_new("四种消息对话框");  
  84.     gtk_container_add(GTK_CONTAINER(window),frame);  
  85.     box = gtk_hbox_new(TRUE,0);  
  86.     gtk_container_add(GTK_CONTAINER(frame),box);  
  87.     gtk_container_set_border_width(GTK_CONTAINER(box),20);  
  88.   
  89.     button1 = gtk_button_new_from_stock(GTK_STOCK_DIALOG_INFO);  
  90.     gtk_box_pack_start(GTK_BOX(box),button1,FALSE,FALSE,5);  
  91.     g_signal_connect(G_OBJECT(button1),"clicked",G_CALLBACK(on_button_clicked),(gpointer)1);  
  92.   
  93.     /*GtkWidget * gtk_button_new_from_stock(const gchar *stock_id); 
  94.      * GTK内部保存的条目:图片和文字。stock_id:对应的ID 
  95.      */  
  96.     button2 = gtk_button_new_from_stock(GTK_STOCK_DIALOG_ERROR);  
  97.     gtk_box_pack_start(GTK_BOX(box),button2,FALSE,FALSE,5);  
  98.     g_signal_connect(G_OBJECT(button2),"clicked",G_CALLBACK(on_button_clicked),(gpointer)2);  
  99.   
  100.     button3 = gtk_button_new_from_stock(GTK_STOCK_DIALOG_QUESTION);  
  101.     gtk_box_pack_start(GTK_BOX(box),button3,FALSE,FALSE,5);  
  102.     g_signal_connect(G_OBJECT(button3),"clicked",G_CALLBACK(on_button_clicked),(gpointer)3);  
  103.   
  104.     button4 = gtk_button_new_from_stock(GTK_STOCK_DIALOG_WARNING);  
  105.     gtk_box_pack_start(GTK_BOX(box),button4,FALSE,FALSE,5);  
  106.     g_signal_connect(G_OBJECT(button4),"clicked",G_CALLBACK(on_button_clicked),(gpointer)4);  
  107.   
  108.     gtk_widget_show_all(window);  
  109.     gtk_main();  
  110.     return FALSE;  
  111. }  

关于对话框
        GtkAboutDialog构件为您提供了一个简单方式,来显示程序的“关于“信息。通常,当用户点GTK_STOCK_ABOUT菜单项时,这个对话框会显示出来。然而,我们要到第九章才会谈到菜单,因此我们的例子对话框就是用顶层窗口。
        用GtkAboutDialog可以显示不同类型的信息。这包括应用程序的名字、版权、当前版本、授权协议、作者、文档、美工和翻译。因为不是每个程序都有这些内容,每一个属性都是可选的。主窗口只显示基本信息,在Figure 5-4中可以看到,连同作者信息。
看下面示例图片:及代码
GTK 对话框_第4张图片
[cpp] view plain copy print ?
  1. /*File: aboutdialogs.c 
  2.  *Date:2013-12-21 
  3.  *Author:sjin 
  4.  *Mail:[email protected] 
  5.  */  
  6.   
  7. #include <gtk/gtk.h>  
  8.   
  9. int main(int argc,char* argv[])  
  10. {  
  11.     GtkWidget *dialog;  
  12.     GdkPixbuf *logo;  
  13.     GError *error = NULL;  
  14.   
  15.     const gchar *authors[] ={  
  16.         "Kyle Loudon",  
  17.         "sjin",  
  18.         NULL  
  19.     };  
  20.   
  21.     const gchar *documenters[]={  
  22.         "指针操作",  
  23.         "递归",  
  24.         "算法",  
  25.         "链表",  
  26.         "栈和队列",  
  27.         "集合",  
  28.         "哈希表",  
  29.         "树",  
  30.         NULL  
  31.     };  
  32.   
  33.     const gchar * translators = "肖翔\n陈珂";  
  34.   
  35.     //初始化环境  
  36.     gtk_init(&argc,&argv);  
  37.     //创建对话框  
  38.     dialog = gtk_about_dialog_new();  
  39.     //创建一个图标  
  40.     logo = gdk_pixbuf_new_from_file("./logo.jpg",&error);  
  41.   
  42.     if(error == NULL){  
  43.         gtk_about_dialog_set_logo(GTK_ABOUT_DIALOG(dialog),logo);  
  44.     } else {  
  45.         if(error->domain == GDK_PIXBUF_ERROR){  
  46.             g_print("GdkPixbuf Error : %s\n",error->message);  
  47.         } else if(error->domain == G_FILE_ERROR){  
  48.             g_print("GFileError : %s\n",error->message);  
  49.         } else {  
  50.             g_print("an error in the domain : %d has occured!\n",error->domain);  
  51.         }  
  52.     }  
  53.   
  54.     //设置显示在主对话框上的数据  
  55.     gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(dialog),"算法精解-C语言描述");  
  56.     gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(dialog),"1.0");  
  57.     gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(dialog),"(C)2007 Andrew Krause");  
  58.     gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(dialog),"我的第一本算法书籍");  
  59.     //设置作者,文档,翻译  
  60.     gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG(dialog),authors);  
  61.     gtk_about_dialog_set_documenters(GTK_ABOUT_DIALOG(dialog),documenters);  
  62.     gtk_about_dialog_set_translator_credits(GTK_ABOUT_DIALOG(dialog),translators);  
  63.   
  64.     gtk_dialog_run(GTK_DIALOG(dialog));  
  65.     gtk_widget_destroy(dialog);  
  66.   
  67.     return FALSE;  
  68. }  

下面是另一种实现思路:
GTK 对话框_第5张图片
[cpp] view plain copy print ?
  1. /*File:about.c 
  2.  *Date:2013-12-22 
  3.  *Author:sjin 
  4.  *Mail:[email protected] 
  5.  * */  
  6. #include <gtk/gtk.h>  
  7.   
  8. static GtkWidget* credits_window;  
  9. GtkWidget* create_credits()  
  10. {  
  11.     GtkWidget* window;  
  12.     GtkWidget* vbox;  
  13.     GtkWidget* notebook;  
  14.     GtkWidget* page;  
  15.     GtkWidget* label;  
  16.   
  17.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
  18.     gtk_window_set_title(GTK_WINDOW(window),"开发人员");  
  19.     vbox = gtk_vbox_new(FALSE,0);  
  20.     gtk_container_add(GTK_CONTAINER(window),vbox);  
  21.     //这里使用了notebook  
  22.     notebook = gtk_notebook_new();  
  23.     gtk_box_pack_start(GTK_BOX(vbox),notebook,FALSE,FALSE,5);  
  24.   
  25.     page = gtk_vbox_new(FALSE,0);  
  26.     label = gtk_label_new("Kyle Loudon");  
  27.     gtk_box_pack_start(GTK_BOX(page),label,FALSE,FALSE,5);  
  28.     label = gtk_label_new("sjin");  
  29.     gtk_box_pack_start(GTK_BOX(page),label,FALSE,FALSE,5);  
  30.     label = gtk_label_new("作者");  
  31.     gtk_notebook_append_page(GTK_NOTEBOOK(notebook),page,label);  
  32.   
  33.     page = gtk_vbox_new(FALSE,0);  
  34.     label = gtk_label_new("集合");  
  35.     gtk_box_pack_start(GTK_BOX(page),label,FALSE,FALSE,5);  
  36.     label = gtk_label_new("文档");  
  37.     gtk_notebook_append_page(GTK_NOTEBOOK(notebook),page,label);  
  38.   
  39.     page = gtk_vbox_new(FALSE,0);  
  40.     label = gtk_label_new("肖翔\n陈珂");  
  41.     gtk_box_pack_start(GTK_BOX(page),label,FALSE,FALSE,5);  
  42.     label = gtk_label_new("翻译");  
  43.     gtk_notebook_append_page(GTK_NOTEBOOK(notebook),page,label);  
  44.     gtk_widget_show_all(window);  
  45.     return window;  
  46. }  
  47.   
  48.   
  49. void show_credits()  
  50. {  
  51.     credits_window = create_credits();  
  52.     gtk_widget_show(credits_window);  
  53. }  
  54.   
  55. int main(int argc,char* argv[])  
  56. {  
  57.     GtkWidget* bbox;  
  58.     GtkWidget* vbox;  
  59.     GtkWidget* label;  
  60.     GtkWidget* window;  
  61.     GtkWidget* sep;  
  62.     GtkWidget* image;  
  63.     GtkWidget* button;  
  64.     gtk_init(&argc,&argv);  
  65.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
  66.     g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);  
  67.     gtk_window_set_title(GTK_WINDOW(window),"关于对话框");  
  68.     gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);  
  69.     gtk_container_set_border_width(GTK_CONTAINER(window),10);  
  70.     vbox = gtk_vbox_new(FALSE,0);  
  71.     gtk_container_add(GTK_CONTAINER(window),vbox);  
  72.     image = gtk_image_new_from_file("logo.jpg");  
  73.     gtk_box_pack_start(GTK_BOX(vbox),image,FALSE,FALSE,5);  
  74.     label = gtk_label_new(NULL);  
  75.     gtk_label_set_markup(GTK_LABEL(label),"<span><big>算法精解-C语言描述</big></span>");  
  76.     gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,5);  
  77.     label = gtk_label_new("版权所有:机械工业出版社\n 作者:Kyle Loudon");  
  78.     gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,5);  
  79.     sep = gtk_hseparator_new();  
  80.     gtk_box_pack_start(GTK_BOX(vbox),sep,FALSE,FALSE,5);  
  81.     bbox = gtk_hbutton_box_new();  
  82.     gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox),GTK_BUTTONBOX_EDGE);  
  83.     gtk_box_pack_start(GTK_BOX(vbox),bbox,FALSE,FALSE,5);  
  84.     button = gtk_button_new_with_label("credits");  
  85.     gtk_box_pack_start(GTK_BOX(bbox),button,FALSE,FALSE,25);  
  86.     g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(show_credits),NULL);  
  87.     button = gtk_button_new_from_stock(GTK_STOCK_OK);  
  88.     g_signal_connect(GTK_OBJECT(button),"clicked",G_CALLBACK(gtk_main_quit),NULL);  
  89.     gtk_box_pack_start(GTK_BOX(bbox),button,FALSE,FALSE,35);  
  90.     gtk_widget_show_all(window);  
  91.     gtk_main();  
  92.     return FALSE;  
  93. }  


参考资料:
http://guoyinghui2012.blog.163.com/blog/static/20871720020126219391244/

你可能感兴趣的:(GTK 对话框)