GTK tutorial 十三

Spin Buttons

Spin Button用于让用户在一个范围内的数值中选择一个数字。它包含一个text entry box,并且在entry box旁边有用于上下翻的箭头按钮。entry box也能够直接被编辑。

下面举例说明其用法。

程序运行结果:

/**spinbutton.c/
#include<stdio.h>
#include<gtk/gtk.h>

static GtkWidget *spinner1;

static void toggle_snap(GtkWidget *widget, GtkSpinButton *spin)
{
    gtk_spin_button_set_snap_to_ticks(spin, GTK_TOGGLE_BUTTON(widget)->active);
}

static void toggle_numeric(GtkWidget *widget, GtkSpinButton *spin)
{
    gtk_spin_button_set_numeric(spin, GTK_TOGGLE_BUTTON(widget)->active);
}

static void change_digits(GtkWidget *widget, GtkSpinButton *spin)
{
    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinner1), gtk_spin_button_get_value_as_int(spin));
}

static void get_value(GtkWidget *widget, gpointer data)
{
    gchar *buf;
    GtkLabel *label;
    GtkSpinButton *spin;

    spin = GTK_SPIN_BUTTON(spinner1);
    label = GTK_LABEL(g_object_get_data(G_OBJECT(widget), "user_data"));
    if(GPOINTER_TO_INT(data) == 1)
        buf = g_strdup_printf("%d", gtk_spin_button_get_value_as_int(spin));
    else
        buf = g_strdup_printf("%0.*f", spin->digits, gtk_spin_button_get_value(spin));

    gtk_label_set_text(label, buf);
    g_free(buf);
}

int main(int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *frame;
    GtkWidget *hbox;
    GtkWidget *main_vbox;
    GtkWidget *vbox;
    GtkWidget *vbox2;
    GtkWidget *spinner2;
    GtkWidget *spinner;
    GtkWidget *button;
    GtkWidget *label;
    GtkWidget *val_label;
    GtkAdjustment *adj;

    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), "Spin Button");

    main_vbox = gtk_vbox_new(FALSE, 5);
    gtk_container_set_border_width(GTK_CONTAINER(main_vbox), 10);
    gtk_container_add(GTK_CONTAINER(window), main_vbox);

    frame = gtk_frame_new("Not accelerated");
    gtk_box_pack_start(GTK_BOX(main_vbox), frame, TRUE, TRUE, 0);

    vbox = gtk_vbox_new(FALSE, 0);
    gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
    gtk_container_add(GTK_CONTAINER(frame), vbox);

    hbox = gtk_hbox_new(FALSE, 0);
    gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 5);

    vbox2 = gtk_vbox_new(FALSE, 0);
    gtk_box_pack_start(GTK_BOX(hbox), vbox2, TRUE, TRUE, 5);

    label = gtk_label_new("Day:");
    gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
    gtk_box_pack_start(GTK_BOX(vbox2), label,FALSE, FALSE, 0);

    adj = (GtkAdjustment *)gtk_adjustment_new(1.0, 1.0, 31.0, 1.0, 5.0, 0.0);

    spinner = gtk_spin_button_new(adj, 0, 0);
    gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(spinner), TRUE);
    gtk_box_pack_start(GTK_BOX(vbox2), spinner, FALSE, TRUE, 0);


    vbox2 = gtk_vbox_new(FALSE, 0);
    gtk_box_pack_start(GTK_BOX(hbox), vbox2, TRUE, TRUE, 5);

    label = gtk_label_new("Month:");
    gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
    gtk_box_pack_start(GTK_BOX(vbox2), label,FALSE, FALSE, 0);

    adj = (GtkAdjustment *)gtk_adjustment_new(1.0, 1.0, 12.0, 1.0, 5.0, 0.0);

    spinner = gtk_spin_button_new(adj, 0, 0);
    gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(spinner), TRUE);
    gtk_box_pack_start(GTK_BOX(vbox2), spinner, FALSE, TRUE, 0);

    vbox2 = gtk_vbox_new(FALSE, 0);
    gtk_box_pack_start(GTK_BOX(hbox), vbox2, TRUE, TRUE, 5);

    label = gtk_label_new("Year:");
    gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
    gtk_box_pack_start(GTK_BOX(vbox2), label,FALSE, FALSE, 0);

    adj = (GtkAdjustment *)gtk_adjustment_new(1998.0, 0.0, 2100.0, 1.0, 100.0, 0.0);

    spinner = gtk_spin_button_new(adj, 0, 0);
    gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(spinner), TRUE);
    gtk_widget_set_size_request(spinner, 55, -1);
    gtk_box_pack_start(GTK_BOX(vbox2), spinner, FALSE, TRUE, 0);


    frame = gtk_frame_new("Accelerated");
    gtk_box_pack_start(GTK_BOX(main_vbox), frame, TRUE, TRUE, 0);

    vbox = gtk_vbox_new(FALSE, 0);
    gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
    gtk_container_add(GTK_CONTAINER(frame), vbox);

    hbox = gtk_hbox_new(FALSE, 0);
    gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 5);

    vbox2 = gtk_vbox_new(FALSE, 0);
    gtk_box_pack_start(GTK_BOX(hbox), vbox2, TRUE, TRUE, 5);


    label = gtk_label_new("Value:");
    gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
    gtk_box_pack_start(GTK_BOX(vbox2), label,FALSE, TRUE, 0);

    adj = (GtkAdjustment *)gtk_adjustment_new(0.0, -1000.0, 1000.0, 0.5, 100.0, 0.0);

    spinner1 = gtk_spin_button_new(adj, 1.0, 2);
    gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(spinner1), TRUE);
    gtk_widget_set_size_request(spinner, 100, -1);
    gtk_box_pack_start(GTK_BOX(vbox2), spinner1, FALSE, TRUE, 0);


    vbox2 = gtk_vbox_new(FALSE, 0);
    gtk_box_pack_start(GTK_BOX(hbox), vbox2, TRUE, TRUE, 5);


    label = gtk_label_new("Digits:");
    gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
    gtk_box_pack_start(GTK_BOX(vbox2), label,FALSE, TRUE, 0);

    adj = (GtkAdjustment *)gtk_adjustment_new(2, 1, 5, 1, 1, 0);

    spinner2 = gtk_spin_button_new(adj, 0, 0);
    gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(spinner2), TRUE);
    g_signal_connect(G_OBJECT(adj), "value_changed", G_CALLBACK(change_digits), (gpointer) spinner2);
    gtk_box_pack_start(GTK_BOX(vbox2), spinner2, FALSE, TRUE, 0);

    hbox = gtk_hbox_new(FALSE, 0);
    gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 5);

    button = gtk_check_button_new_with_label("Snap to 0.5-ticks");
    g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(toggle_snap), (gpointer)spinner1);
    gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0);
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);


    button = gtk_check_button_new_with_label("Numeric only input mode");
    g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(toggle_numeric), (gpointer)spinner1);
    gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0);
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);


    val_label = gtk_label_new("");

    hbox = gtk_hbox_new(FALSE, 0);
    gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 5);
    button = gtk_button_new_with_label("Value as Int");
    g_object_set_data(G_OBJECT(button), "user_data", val_label);
    g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(get_value), GINT_TO_POINTER(1));
    gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 5);

    button = gtk_button_new_with_label("Value as Float");
    g_object_set_data(G_OBJECT(button), "user_data", val_label);
    g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(get_value), GINT_TO_POINTER(2));
    gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 5);

    gtk_box_pack_start(GTK_BOX(vbox), val_label, TRUE, TRUE, 0);
    gtk_label_set_text(GTK_LABEL(val_label), "0");


    hbox = gtk_hbox_new(FALSE, 0);
    gtk_box_pack_start(GTK_BOX(main_vbox), hbox, FALSE, TRUE, 0);

    button = gtk_button_new_with_label("Close");
    g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK(gtk_widget_destroy), G_OBJECT(window));
    gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 5);

    gtk_widget_show_all(window);

    gtk_main();

    return 0;


}

编译命令:

gcc -Wall -g spinbutton.c -o spinbutton `pkg-config --cflags gtk+-2.0 pkg-config --libs gtk+-2.0` 

 Combo Box

Combox Box是一个widget的集合。它包含一个text entry box和一个下拉菜单。通过下拉菜单可以选择其中的项,也可以在text entry box中键入字符串。

下面举例说明。

程序运行结果:

 

/**combobox.c/

#include<gtk/gtk.h>

void on_combo_box_changed(GtkComboBox *combo_box, gpointer user_data)
{
    gint active_index = gtk_combo_box_get_active(combo_box);
    if(active_index != -1)
    {
        GtkTreeModel *model;
        GtkTreeIter iter;
        gchar *item_text;
        
        model = gtk_combo_box_get_model(combo_box);
        gtk_tree_model_iter_nth_child(model, &iter, NULL, active_index);
        gtk_tree_model_get(model, &iter, 0, &item_text, -1);
        g_print("Selected item: %s\n", item_text);
        g_free(item_text);

    }
}

int main(int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *combo_box;
    GtkList *glist = NULL;
    GtkTreeIter iter;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "GTK ComboBox Example");
    gtk_window_set_default_size(GTK_WINDOW(window), 250, 150);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    combo_box = gtk_combo_new();

    glist = g_list_append(glist, "String 1");
    glist = g_list_append(glist, "String 2");
    glist = g_list_append(glist, "String 3");
    glist = g_list_append(glist, "String 4");

    gtk_combo_set_popdown_strings(GTK_COMBO(combo_box), glist);

    g_signal_connect(combo_box, "changed", G_CALLBACK(on_combo_box_changed), NULL);

    gtk_container_add(GTK_CONTAINER(window), combo_box);

    gtk_widget_show_all(window);

    gtk_main();

    return 0;

}

编译命令:

gcc -Wall -g combobox.c -o combobox `pkg-config --cflags gtk+-2.0 pkg-config --libs gtk+-2.0` 

 Calendar

如标题,这是一个用于显示日历的widget.下面我们举例说明其UI及其相关功能。

程序运行结果如下:

/*calendar.c*/
#include<stdio.h>
#include<string.h>
#include<gtk/gtk.h>

#define DEF_PAD         10
#define DEF_PAD_SAMLL   5

#define TM_YEAE_BASE    1900


typedef struct _CalendarData{
    GtkWidget *flag_checkboxes[5];
    gboolean settings[5];
    GtkWidget *font_dialog;
    GtkWidget *window;
    GtkWidget *prev2_sig;
    GtkWidget *prev_sig;
    GtkWidget *last_sig;
    GtkWidget *month;
}CalendarData;

enum{
    calendar_show_header,
    calendar_show_days,
    calendar_month_change,
    calendar_show_week,
    calendar_monday_first
};


static void calendar_data_to_string(CalendarData *data, char *buffer,
                                    gint buffer_len)
{
    GDate date;
    guint year, month, day;

    gtk_calendar_get_date(GTK_CALENDAR(data->window), &year, &month, &day);
    g_date_set_dmy(&date, day, month + 1, year);
    g_date_strftime(buffer, buffer_len -1, "%x", &date);
}

static void calendar_set_signal_strings(char *sig_str, CalendarData *data)
{
    const gchar *prev_sig;

    prev_sig = gtk_label_get_text(GTK_LABEL(data->prev2_sig));
    gtk_label_set_text(GTK_LABEL(data->prev2_sig), prev_sig);

    prev_sig = gtk_label_get_text(GTK_LABEL(data->last_sig));
    gtk_label_set_text(GTK_LABEL(data->prev_sig), prev_sig);
    gtk_label_set_text(GTK_LABEL(data->last_sig), sig_str);

}

static void calendar_month_changed(GtkWidget *widget, CalendarData *data)
{
    char buffer[256] = "month_changed: ";
    calendar_data_to_string(data, buffer + 15, 256 - 15);
    calendar_set_signal_strings(buffer, data);
}

static void calendar_day_selected(GtkWidget *widget, CalendarData *data)
{
    char buffer[256] = "day_selected: ";

    calendar_data_to_string(data, buffer + 14, 256 - 14);
    calendar_set_signal_strings(buffer, data);
}

static void calendar_day_selected_double_click(GtkWidget *widget, CalendarData *data)
{
    char buffer[256] = "day_selected_double_click: ";
    guint day;

    calendar_data_to_string(data, buffer + 27, 256 - 27);
    calendar_set_signal_strings(buffer, data);

    gtk_calendar_get_date(GTK_CALENDAR(data->window), NULL, NULL, &day);

    if(GTK_CALENDAR(data->window)->marked_date[day - 1] == 0)
        gtk_calendar_mark_day(GTK_CALENDAR(data->window), day);
    else
        gtk_calendar_unmark_day(GTK_CALENDAR(data->window), day);
}


static void calendar_prev_month(GtkWidget *widget, CalendarData *data)
{
    char buffer[256] = "prev_month: ";

    calendar_data_to_string(data, buffer + 12, 256 - 12);
    calendar_set_signal_strings(buffer, data);
}


static void calendar_next_month(GtkWidget *widget, CalendarData *data)
{
    char buffer[256] = "next_month: ";

    calendar_data_to_string(data, buffer + 12, 256 - 12);
    calendar_set_signal_strings(buffer, data);
}


static void calendar_prev_year(GtkWidget *widget, CalendarData *data)
{
    char buffer[256] = "prev_year: ";

    calendar_data_to_string(data, buffer + 11, 256 - 11);
    calendar_set_signal_strings(buffer, data);
}


static void calendar_next_year(GtkWidget *widget, CalendarData *data)
{
    char buffer[256] = "next_year: ";

    calendar_data_to_string(data, buffer + 11, 256 - 11);
    calendar_set_signal_strings(buffer, data);
}

static void calendar_set_flags(CalendarData *calendar)
{
    gint i;
    gint options = 0;
    for ( i = 0; i < 5; i++)
    {
        if(calendar->settings[i])
            options = options + (1<<i);            
    }

    if(calendar->window)
        gtk_calendar_display_options(GTK_CALENDAR(calendar->window), options);
    
}


static void calendar_toggle_flag(GtkWidget *toggle, CalendarData *calendar)
{
    gint i;
    gint j;
    j = 0;
    for ( i = 0; i < 5; i++)
    {
        if(calendar->flag_checkboxes[i] == toggle)
            j = i;
    }

    calendar->settings[j] = !calendar->settings[j];
    calendar_set_flags(calendar);
    
}


static void calendar_font_selection_ok(GtkWidget *button, CalendarData *calendar)
{
    GtkRcStyle *style;
    char *font_name;

    if(calendar->window)
    {
        font_name = gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(calendar->font_dialog));
        if(font_name)
        {
            style = gtk_rc_style_new();
            pango_font_description_free(style->font_desc);
            style->font_desc = pango_font_description_from_string(font_name);
            gtk_widget_modify_style(calendar->window, style);
            g_free(font_name);
        }
    }

    gtk_widget_destroy(calendar->font_dialog);
}

static void calendar_select_font(GtkWidget *button, CalendarData *calendar)
{
    GtkWidget *window;

    if(!calendar->font_dialog)
    {
        window = gtk_font_selection_dialog_new("Font Selection Dialog");
        g_return_if_fail(GTK_IS_FONT_SELECTION_DIALOG(window));
        calendar->font_dialog = window;

        gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_MOUSE);

        g_signal_connect(window, "destroy",G_CALLBACK(gtk_widget_destroyed), &calendar->font_dialog);
        g_signal_connect(GTK_FONT_SELECTION_DIALOG(window)->ok_button, "clicked",
                            G_CALLBACK(calendar_font_selection_ok), calendar);
        g_signal_connect_swapped(GTK_FONT_SELECTION_DIALOG(window)->cancel_button, "clicked",
                                    G_CALLBACK(gtk_widget_destroy), calendar->font_dialog);
    }

    window = calendar->font_dialog;
    if(!GTK_WIDGET_VISIBLE(window))
        gtk_widget_show(window);
    else
        gtk_widget_destroy(window);
}


static void create_calendar(void)
{
    GtkWidget *window;
    GtkWidget *vbox;
    GtkWidget *vbox2;
    GtkWidget *vbox3;
    GtkWidget *hbox;
    GtkWidget *hbbox;
    GtkWidget *calendar;
    GtkWidget *toggle;
    GtkWidget *button;
    GtkWidget *frame;
    GtkWidget *separator;
    GtkWidget *label;
    GtkWidget *bbox;
    static CalendarData calendar_data;
    gint i;

    struct 
    {
        char *label;
    } flags[] =
        {
            {"Show Heading"},
            {"Show Day Names"},
            {"No Month Change"},
            {"Show Week Numbers"},
            {"Week Start Monday"}
        };
    
    calendar_data.window = NULL;
    calendar_data.font_dialog = NULL;

    for ( i = 0; i < 5; i++)
    {
        calendar_data.settings[i] = 0;
    }

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "GtkCalendar Example");
    gtk_container_set_border_width(GTK_CONTAINER(window), 5);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    g_signal_connect(window, "delete-event", G_CALLBACK(gtk_false), NULL);
    gtk_window_set_resizable(GTK_WINDOW(window), FALSE);

    vbox = gtk_vbox_new(FALSE, DEF_PAD);
    gtk_container_add(GTK_CONTAINER(window), vbox);

    hbox = gtk_hbox_new(FALSE, DEF_PAD);
    gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, DEF_PAD);
    hbbox = gtk_hbutton_box_new();
    gtk_box_pack_start(GTK_BOX(hbox), hbbox, FALSE, FALSE, DEF_PAD);
    gtk_button_box_set_layout(GTK_BUTTON_BOX(hbbox), GTK_BUTTONBOX_SPREAD);
    gtk_box_set_spacing(GTK_BOX(hbbox), 5);

    frame = gtk_frame_new("calendar");
    gtk_box_pack_start(GTK_BOX(hbbox), frame, FALSE, TRUE, DEF_PAD);
    calendar = gtk_calendar_new();
    calendar_data.window = calendar;
    calendar_set_flags(&calendar_data);
    gtk_calendar_mark_day(GTK_CALENDAR(calendar), 19);
    gtk_container_add(GTK_CONTAINER(frame), calendar);
    g_signal_connect(calendar, "month_changed", G_CALLBACK(calendar_month_changed), &calendar_data);
    g_signal_connect(calendar, "day_selected", G_CALLBACK(calendar_day_selected), &calendar_data);
    g_signal_connect(calendar, "day_selected_double_click", 
                    G_CALLBACK(calendar_day_selected_double_click), &calendar_data);
    g_signal_connect(calendar, "prev_month", G_CALLBACK(calendar_prev_month), &calendar_data);
    g_signal_connect(calendar, "next_month", G_CALLBACK(calendar_next_month), &calendar_data);
    g_signal_connect(calendar, "prev_year", G_CALLBACK(calendar_prev_year), &calendar_data);
    g_signal_connect(calendar, "next_year", G_CALLBACK(calendar_next_year), &calendar_data);


    separator = gtk_vseparator_new();
    gtk_box_pack_start(GTK_BOX(hbox), separator, FALSE, TRUE, 0);

    vbox2 = gtk_vbox_new(FALSE, DEF_PAD);
    gtk_box_pack_start(GTK_BOX(hbox), vbox2, FALSE, FALSE, DEF_PAD);

    frame = gtk_frame_new("flags");
    gtk_box_pack_start(GTK_BOX(vbox2), frame, TRUE, TRUE, DEF_PAD);
    vbox3 = gtk_vbox_new(TRUE, DEF_PAD_SAMLL);
    gtk_container_add(GTK_CONTAINER(frame), vbox3);

    for ( i = 0; i < 5; i++)
    {
        toggle = gtk_check_button_new_with_label(flags[i].label);
        g_signal_connect(toggle, "toggled", 
                            G_CALLBACK(calendar_toggle_flag), &calendar_data);
        
        gtk_box_pack_start(GTK_BOX(vbox3), toggle, TRUE, TRUE, 0);
        calendar_data.flag_checkboxes[i] = toggle;
    }
    
    button = gtk_button_new_with_label("Font...");
    g_signal_connect(button, "clicked",
                        G_CALLBACK(calendar_select_font), &calendar_data);

    gtk_box_pack_start(GTK_BOX(vbox2), button, FALSE, FALSE, 0);


    frame = gtk_frame_new("Signal events");
    gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, DEF_PAD);

    vbox2 = gtk_vbox_new(TRUE, DEF_PAD_SAMLL);
    gtk_container_add(GTK_CONTAINER(frame), vbox2);

    hbox = gtk_hbox_new(FALSE, 3);
    gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, TRUE, 0);
    label = gtk_label_new("Signal:");
    gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0);
    calendar_data.last_sig = gtk_label_new("");
    gtk_box_pack_start(GTK_BOX(hbox), calendar_data.last_sig, FALSE, TRUE, 0);

    hbox = gtk_hbox_new(FALSE, 3);
    gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, TRUE, 0);
    label = gtk_label_new("Previous signal:");
    gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0);
    calendar_data.prev_sig = gtk_label_new("");
    gtk_box_pack_start(GTK_BOX(hbox), calendar_data.prev_sig, FALSE, TRUE, 0);


   hbox = gtk_hbox_new(FALSE, 3);
    gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, TRUE, 0);
    label = gtk_label_new("Second previous signal:");
    gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0);
    calendar_data.prev2_sig = gtk_label_new("");
    gtk_box_pack_start(GTK_BOX(hbox), calendar_data.prev2_sig, FALSE, TRUE, 0);

    bbox = gtk_hbutton_box_new();
    gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
    gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);

    button = gtk_button_new_with_label("close");
    g_signal_connect(button, "clicked",
                        G_CALLBACK(gtk_main_quit), NULL);

    gtk_container_add(GTK_CONTAINER(bbox), button);
    GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
    gtk_widget_grab_default(button);

    gtk_widget_show_all(window);
    
}


int main(int argc, char *argv[])
{
    gtk_init(&argc, &argv);

    create_calendar();

    gtk_main();

    return 0;
}

 编译命令:

gcc -Wall -g calendar.c -o calendar `pkg-config --cflags gtk+-2.0 pkg-config --libs gtk+-2.0`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值