GTK编程基础------对话框

对话框       

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

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

具体看下面一个简单的例子:
/*File:dialogs.c
 *Date:2013-12-16
 *Author:sjin
 *Mail:413977243@qq.com
 */

#include <gtk/gtk.h>

//无模式窗口
//#define SCHEMALESS_WINDOW

void button_click(GtkWidget *widget,GtkWindow *parent)
{
    GtkWidget *dialog;
    GtkWidget *label;
    GtkWidget *image;
    GtkWidget *hbox;

    /*GtkWidget * gtk_dialog_new_with_buttons(
     *           const gchar *title,对话框标题
     *           GtkWindow *parent,对话框父窗口
     *           GtkDialogFlags flags,
     *           const gchar *first_button_text,动作区域按钮列表
     *           ...);
     *           falgs:GTK_DIALOG_MODAL:对话框始终保持在父窗口的上部,直到关闭,防止父窗口交互
     *                 GTK_DIALOG_DESTROY_WITH_PARENT:父窗口销毁,对话框也销毁
     *                 GTK_DIALOG_NO_SEPARATOR:不显示分割线
     *
     * */
#ifndef SCHEMALESS_WINDOW
    dialog = gtk_dialog_new_with_buttons("我的第一个对话框",parent,GTK_DIALOG_MODAL,GTK_STOCK_OK,GTK_RESPONSE_OK,NULL);
#else
    dialog = gtk_dialog_new_with_buttons("我的第一个对话框",parent,GTK_DIALOG_DESTROY_WITH_PARENT,GTK_STOCK_OK,GTK_RESPONSE_OK,NULL);
#endif
    /*设置分割线是否隐藏:FALSE:隐藏。*/
    gtk_dialog_set_has_separator(GTK_DIALOG(dialog),FALSE);
    label = gtk_label_new("the button was clicked!");

    /*GtkWidget * gtk_image_new_from_stock(const gchar *stock_id,
     *            GtklconSize size)
     * 创建一个预制的Gtkimage构件,当载入一个图片时,还需要指定图片的
     *大小,如果图片没有找到,GTK会自动寻找一个自制的图标
     * size :参数 GTK_ICON_SIZE_INVALID:未指定大小
     *            GTK_ICON_SIZE_MENU : 16X16像素
     *            GTK_ICON_SIZE_SMALL_TOOLBAR: 18X18像素
     *            GTK_ICON_SIZE_LARGE_TOOLBAR: 24X24像素
     *            GTK_ICON_SIZE_BUTTON: 24X24像素
     *            GTK_ICON_SIZE_DND: 32X32像素
     *            GTK_ICON_SIZE_DIALOG: 48X48像素
     *还有另外两个加载图片的函数
     *GtkWidget*gtk_image_new_from_file(const gchar *filename)
     *GtkWidget *gtk_image_new_from_pixbuf(GdkPixbuf *pixbuf)
     * */
    image = gtk_image_new_from_stock(GTK_STOCK_DIALOG_INFO,GTK_ICON_SIZE_DIALOG);
    
    hbox = gtk_hbox_new(FALSE,5);
    gtk_container_set_border_width(GTK_CONTAINER(hbox),10);
    gtk_box_pack_start_defaults(GTK_BOX(hbox),image);
    gtk_box_pack_start_defaults(GTK_BOX(hbox),label);
    gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox),hbox);
    gtk_widget_show_all(dialog);

#ifndef SCHEMALESS_WINDOW
    /*显示对话框*/
    gtk_dialog_run(GTK_DIALOG(dialog));
    gtk_widget_destroy(dialog);
#else
    g_signal_connect(G_OBJECT(dialog),"response",G_CALLBACK(gtk_widget_destroy),NULL);
#endif

}

int main(int argc, char*argv[])
{
	GtkWidget *window;
	GtkWidget *button;

	//初始化GTK
	gtk_init(&argc,&argv);
	//创建最上层主窗口
	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	//连接信号"delete_event",使得窗口关闭时发生
	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),200,300);
	//设定窗口的位置,让窗口总在最前端
	gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
	//设定容器边框的宽度
	gtk_container_set_border_width(GTK_CONTAINER(window),20);

	//创建按钮
	button = gtk_button_new_with_mnemonic("clicked me");
	gtk_container_add(GTK_CONTAINER(window),button);
    g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(button_click),(gpointer)window);
	gtk_widget_show(button);

	gtk_widget_show_all(window);
	gtk_main();
	return 0;
}


编译时有两种模式,-D SCHEMALESS_WINDOW 是无模式窗口,和模式窗口(不能和父窗口交互,永远在父窗口上面)。
运行:


另外一个对话框的应用:
/*File:dialogs3.c
 *Date:2013-12-16
 *Author:sjin
 *Mail:413977243@qq.com
 */

#include <gtk/gtk.h>


int main(int argc, char*argv[])
{
    GtkWidget *dialog;
    GtkWidget *table;
    GtkWidget *user,*real,*home,*host;
    GtkWidget *lbl1,*lbl2,*lbl3,*lbl4;
    gint result;

	//初始化GTK
	gtk_init(&argc,&argv);

    /*GtkWidget * gtk_dialog_new_with_buttons(
     *           const gchar *title,对话框标题
     *           GtkWindow *parent,对话框父窗口
     *           GtkDialogFlags flags,
     *           const gchar *first_button_text,动作区域按钮列表
     *           ...);
     *           falgs:GTK_DIALOG_MODAL:对话框始终保持在父窗口的上部,直到关闭,防止父窗口交互
     *                 GTK_DIALOG_DESTROY_WITH_PARENT:父窗口销毁,对话框也销毁
     *                 GTK_DIALOG_NO_SEPARATOR:不显示分割线
     *
     * */
    dialog = gtk_dialog_new_with_buttons("用户信息编辑窗口",NULL,
                                         GTK_DIALOG_MODAL,
                                         GTK_STOCK_OK,GTK_RESPONSE_OK,
                                         GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,
                                         NULL);
    //设置缺省按钮
    gtk_dialog_set_default_response(GTK_DIALOG(dialog),GTK_RESPONSE_OK);
    
    //创建4个条目,告诉用户输入的数据
    lbl1 = gtk_label_new("User Name");
    lbl2 = gtk_label_new("Real Name");
    lbl3 = gtk_label_new("Home Dir");
    lbl4 = gtk_label_new("Host Name");
    user = gtk_entry_new();
    real = gtk_entry_new();
    home = gtk_entry_new();
    host = gtk_entry_new();

    //设置条目的缺省值
    gtk_entry_set_text(GTK_ENTRY(user),g_get_user_name());
    gtk_entry_set_text(GTK_ENTRY(real),g_get_real_name());
    gtk_entry_set_text(GTK_ENTRY(home),g_get_home_dir());
    gtk_entry_set_text(GTK_ENTRY(host),g_get_host_name());

    //表组装
    table = gtk_table_new(4,2,FALSE);
    gtk_table_attach_defaults(GTK_TABLE(table),lbl1,0,1,0,1);
    gtk_table_attach_defaults(GTK_TABLE(table),lbl2,0,1,1,2);
    gtk_table_attach_defaults(GTK_TABLE(table),lbl3,0,1,2,3);
    gtk_table_attach_defaults(GTK_TABLE(table),lbl4,0,1,3,4);
    gtk_table_attach_defaults(GTK_TABLE(table),user,1,2,0,1);
    gtk_table_attach_defaults(GTK_TABLE(table),real,1,2,1,2);
    gtk_table_attach_defaults(GTK_TABLE(table),home,1,2,2,3);
    gtk_table_attach_defaults(GTK_TABLE(table),host,1,2,3,4);

    gtk_table_set_row_spacings(GTK_TABLE(table),5);
    gtk_table_set_col_spacings(GTK_TABLE(table),5);
    gtk_container_set_border_width(GTK_CONTAINER(table),5);
    gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox),table);
    gtk_widget_show_all(dialog);

    //运行和输出对话框
    result = gtk_dialog_run(GTK_DIALOG(dialog));

    switch(result){
        case GTK_RESPONSE_NONE:
            /*-1
             * 对话框被窗口管理器销毁或通过gtk_widget_destroy()有其他程序销毁。
             * 如果构件没有设置一个相应标识,会返回它。
             */
            break;
        case GTK_RESPONSE_REJECT:
            /* -2
             * 这个标识没有和对话框内置的任何按钮相关联,可以任意使用它
             * */
            break;
        case GTK_RESPONSE_ACCEPT:
            /* -3
             * 这个标识没有和对话框内置的任何按钮相关联,可以任意使用它
             * */
            break;
        case GTK_RESPONSE_DELETE_EVENT:
            /* -4
             * 每个对话框都会自动连接到delete-event信号,当gtk_dialog_run()
             * 运行是,这个标识会被返回,而且delete-event会被终止、不会像
             * 往常那样销毁窗口
             * */
            break;
            
        case GTK_RESPONSE_OK:
            /* -5
             * GTK_STOCK_OK 被点击
             */
            g_print("User Name:\t%s\n",gtk_entry_get_text(GTK_ENTRY(user)));
            g_print("Real Name:\t%s\n",gtk_entry_get_text(GTK_ENTRY(real)));
            g_print("Home Dir:\t%s\n",gtk_entry_get_text(GTK_ENTRY(home)));
            g_print("Host Name:\t%s\n",gtk_entry_get_text(GTK_ENTRY(host)));

            break;
        case GTK_RESPONSE_CANCEL:
            /*-6
             * GTK_STOCK_CANCEL被点击
             * */
            g_print("cancel is press!\n");

            break;
        case GTK_RESPONSE_CLOSE:
            /* -7
             *GTK_STOCK_CLOSE被点击
             */
            break;
        case GTK_RESPONSE_YES:
            /* -8
             *GTK_STOCK_YES被点击
             */
            break;
        case GTK_RESPONSE_NO:
            /* -9
             *GTK_STOCK_NO被点击
             */
            break;
        case GTK_RESPONSE_APPLY:
            /* -10
             *GTK_STOCK_APPLY被点击
             */
            break;
        case GTK_RESPONSE_HELP:
            /* -11
             *GTK_STOCK_HELP被点击
             */
            break;
        default:
            g_print("something wrong!\n");

            break;
    }

    gtk_widget_destroy(dialog);
	//gtk_main();
	return 0;
}
运行结果如下:


消息对话框
        消息对话框用于下列四种消息:一般信息、错误信息、警告和问题。对话框的类型决定了显示的图表类型、对话框标题和添加的按钮。
        还有一种通用类型的对话框,它对内容没有任何假设。在多数情况下,您不需要使用它,因为上述四种类型基本上满足了大部分需求。
        重新创建GtkMessageDialog构件是很容易的。前面的两个例子实现了一个简单的消息对话框,但是GtkMessageDialog已经提供了这个功能,因此您不需要重新创建这个构件。使用GtkMessageDialog节省了代码,而且避免您反复重新创建这种构件,其实大部分应用程序反复使用GtkMessageDialog。它还为所有GTK+应用程序提供了一个统一的外观。
   具体看下面的示例:

具体代码如下:
/*File: message.c
 *Date:2013-12-21
 *Author:sjin
 *Mail:43977243@qq.com
 */

#include <gtk/gtk.h>

static void on_button_clicked(GtkWidget* button,gpointer 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;
    default:
        break;
    }
    /*GtkWidget * gtk_message_dialog_new(GtkWindow *parent,
     *                 GtkDialogFlags flags,
     *                 GtkMessageType type,
     *                 GtkButtonsType buttons,
     *                 const gchar * message_format,
     *                 ...);
     *   type :枚举的五个可能值:
     *        GTK_MESSAGE_INFO:显示用户的一般性消息
     *        GTK_MESSAGE_WARNING:一个警告信息,表示发生了非致命的错误
     *        GTK_MESSAGE_QUESTION:询问用户一个问题,用户必须做出选择。
     *        GTK_MESSAGE_ERROR:警告信息,标识发生了一个致命的错误
     *        GTK_MESSAGE_OTHER:一般类型的消息
     *  buttons:显示什么类型的按钮
     *        GTK_BUTTONS_NONE:不添加任何按钮。
     *        GTK_BUTTONS_OK:添加GTK_STOCK_OK按钮
     *        GTK_BUTTONS_CLOSE:添加GTK_STOCK_CLOSE按钮
     *        GTK_BUTTONS_CANCEL:添加GTK_STOCK_CANCEL按钮
     *        GTK_BUTTONS_YES_NO:添加GTK_STOCK_YES和GTK_STOCK_NO
     *        GTK_BUTTONS_OK_CANCEL: ...
     *   最后一个参数是显示对话框中的内容
     *
     *   void gtk_message_dialog_set_format_secondary_text(GtkMessageDialog*dialog,
     *                          const gchar *message_format,
     *                          ...);
     *   为消息对话框添加第二段文本,他会导致第一个文本被设置成粗体。这个功能
     *   非常有用,它允许您在第一段文字中写一个简短的概要,在第二段文本中详细
     *   描述。通过gtk_message_set_format_secondary_markup()来设置文本格式
     * */

    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);

    /*GtkWidget * gtk_button_new_from_stock(const gchar *stock_id);
     * GTK内部保存的条目:图片和文字。stock_id:对应的ID
     */
    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;
}

关于对话框
        GtkAboutDialog构件为您提供了一个简单方式,来显示程序的“关于“信息。通常,当用户点GTK_STOCK_ABOUT菜单项时,这个对话框会显示出来。然而,我们要到第九章才会谈到菜单,因此我们的例子对话框就是用顶层窗口。
        用GtkAboutDialog可以显示不同类型的信息。这包括应用程序的名字、版权、当前版本、授权协议、作者、文档、美工和翻译。因为不是每个程序都有这些内容,每一个属性都是可选的。主窗口只显示基本信息,在Figure 5-4中可以看到,连同作者信息。
看下面示例图片:及代码
/*File: aboutdialogs.c
 *Date:2013-12-21
 *Author:sjin
 *Mail:43977243@qq.com
 */

#include <gtk/gtk.h>

int main(int argc,char* argv[])
{
    GtkWidget *dialog;
    GdkPixbuf *logo;
    GError *error = NULL;

    const gchar *authors[] ={
        "Kyle Loudon",
        "sjin",
        NULL
    };

    const gchar *documenters[]={
        "指针操作",
        "递归",
        "算法",
        "链表",
        "栈和队列",
        "集合",
        "哈希表",
        "树",
        NULL
    };

    const gchar * translators = "肖翔\n陈珂";

    //初始化环境
    gtk_init(&argc,&argv);
    //创建对话框
    dialog = gtk_about_dialog_new();
    //创建一个图标
    logo = gdk_pixbuf_new_from_file("./logo.jpg",&error);

    if(error == NULL){
        gtk_about_dialog_set_logo(GTK_ABOUT_DIALOG(dialog),logo);
    } else {
        if(error->domain == GDK_PIXBUF_ERROR){
            g_print("GdkPixbuf Error : %s\n",error->message);
        } else if(error->domain == G_FILE_ERROR){
            g_print("GFileError : %s\n",error->message);
        } else {
            g_print("an error in the domain : %d has occured!\n",error->domain);
        }
    }

    //设置显示在主对话框上的数据
    gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(dialog),"算法精解-C语言描述");
    gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(dialog),"1.0");
    gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(dialog),"(C)2007 Andrew Krause");
    gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(dialog),"我的第一本算法书籍");
    //设置作者,文档,翻译
    gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG(dialog),authors);
    gtk_about_dialog_set_documenters(GTK_ABOUT_DIALOG(dialog),documenters);
    gtk_about_dialog_set_translator_credits(GTK_ABOUT_DIALOG(dialog),translators);

    gtk_dialog_run(GTK_DIALOG(dialog));
    gtk_widget_destroy(dialog);

    return FALSE;
}

下面是另一种实现思路:

/*File:about.c
 *Date:2013-12-22
 *Author:sjin
 *Mail:413977243@qq.com
 * */
#include <gtk/gtk.h>

static GtkWidget* credits_window;
GtkWidget* create_credits()
{
    GtkWidget* window;
    GtkWidget* vbox;
    GtkWidget* notebook;
    GtkWidget* page;
    GtkWidget* label;

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window),"开发人员");
    vbox = gtk_vbox_new(FALSE,0);
    gtk_container_add(GTK_CONTAINER(window),vbox);
    //这里使用了notebook
    notebook = gtk_notebook_new();
    gtk_box_pack_start(GTK_BOX(vbox),notebook,FALSE,FALSE,5);

    page = gtk_vbox_new(FALSE,0);
    label = gtk_label_new("Kyle Loudon");
    gtk_box_pack_start(GTK_BOX(page),label,FALSE,FALSE,5);
    label = gtk_label_new("sjin");
    gtk_box_pack_start(GTK_BOX(page),label,FALSE,FALSE,5);
    label = gtk_label_new("作者");
    gtk_notebook_append_page(GTK_NOTEBOOK(notebook),page,label);

    page = gtk_vbox_new(FALSE,0);
    label = gtk_label_new("集合");
    gtk_box_pack_start(GTK_BOX(page),label,FALSE,FALSE,5);
    label = gtk_label_new("文档");
    gtk_notebook_append_page(GTK_NOTEBOOK(notebook),page,label);

    page = gtk_vbox_new(FALSE,0);
    label = gtk_label_new("肖翔\n陈珂");
    gtk_box_pack_start(GTK_BOX(page),label,FALSE,FALSE,5);
    label = gtk_label_new("翻译");
    gtk_notebook_append_page(GTK_NOTEBOOK(notebook),page,label);
    gtk_widget_show_all(window);
    return window;
}


void show_credits()
{
    credits_window = create_credits();
    gtk_widget_show(credits_window);
}

int main(int argc,char* argv[])
{
    GtkWidget* bbox;
    GtkWidget* vbox;
    GtkWidget* label;
    GtkWidget* window;
    GtkWidget* sep;
    GtkWidget* image;
    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),10);
    vbox = gtk_vbox_new(FALSE,0);
    gtk_container_add(GTK_CONTAINER(window),vbox);
    image = gtk_image_new_from_file("logo.jpg");
    gtk_box_pack_start(GTK_BOX(vbox),image,FALSE,FALSE,5);
    label = gtk_label_new(NULL);
    gtk_label_set_markup(GTK_LABEL(label),"<span><big>算法精解-C语言描述</big></span>");
    gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,5);
    label = gtk_label_new("版权所有:机械工业出版社\n 作者:Kyle Loudon");
    gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,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_EDGE);
    gtk_box_pack_start(GTK_BOX(vbox),bbox,FALSE,FALSE,5);
    button = gtk_button_new_with_label("credits");
    gtk_box_pack_start(GTK_BOX(bbox),button,FALSE,FALSE,25);
    g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(show_credits),NULL);
    button = gtk_button_new_from_stock(GTK_STOCK_OK);
    g_signal_connect(GTK_OBJECT(button),"clicked",G_CALLBACK(gtk_main_quit),NULL);
    gtk_box_pack_start(GTK_BOX(bbox),button,FALSE,FALSE,35);
    gtk_widget_show_all(window);
    gtk_main();
    return FALSE;
}


参考资料:
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值