用GTK制作自动售货机

时间:2013-08-12 15:48:47

标签: gtk

#include "UI.h"

GtkWidget* create_main_frame(gint wid, gint hgt) 
{
    GtkWidget* main_frame = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    /* window attributes */
    gtk_window_set_title( GTK_WINDOW(main_frame), "Welcome!!" );
    gtk_window_set_default_size( GTK_WINDOW(main_frame), wid, hgt );

    /* signals */
    g_signal_connect(main_frame, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    return main_frame;  
}

GtkWidget* create_scrolled_window(void)
{
    GtkWidget* scrolled_window = gtk_scrolled_window_new(NULL, NULL);

    gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS );
    gtk_container_set_border_width( GTK_CONTAINER(scrolled_window), 10 );

    return scrolled_window;
}

GtkWidget* create_box(GtkOrientation orn, gint spc)
{
    GtkWidget* box = gtk_box_new(orn, spc);

    //gtk_container_set_border_width( GTK_CONTAINER(box), 5 );

    return box;
}

GtkWidget* create_layout(guint wid, guint hgt)
{
    GtkWidget* layout = gtk_layout_new(NULL, NULL);

    gtk_layout_set_size( GTK_LAYOUT(layout), wid, hgt );    

    return layout;
}

GtkWidget* create_grid(guint rsp, guint csp)
{
    GtkWidget* grid = gtk_grid_new();

    gtk_grid_set_row_spacing( GTK_GRID(grid), rsp );
    gtk_grid_set_column_spacing( GTK_GRID(grid), csp );

    return grid;
}
/*
GtkWidget* create_token_button(Token* tkn)
{
    char parsed_value[11];
    char* string = parse_to_string(tkn -> value, parsed_value); 
    GtkWidget* button = gtk_button_new_with_label(value);

    //gtk_signal_connect(button, "clicked", G_CALLBACK, );

    return button;
}
*/

GtkWidget* create_commodity_button(Commodity* com)
{
    GtkWidget* button = gtk_button_new_with_label(com -> name);

    //gtk_signal_connect(button, "clicked", G_CALLBACK, );

    return button;  
}


#include "UI.h"

int main(int argc, char* argv[])
{
    int i, j;
    /* vending machine */
    VendingMachine* vending_machine; 

    /* frames */
    GtkWidget* main_frame;
    GtkWidget* scrolled_window;
    GtkWidget* commodity_box, * commodity_layout, * commodity_grid, * commodity_button;

    /* initialize */
    gtk_init(&argc, &argv);
    make_new_vending_machine_memory(&vending_machine, sizeof(VendingMachine) ); 
    boot_vending_machine(vending_machine, 13, 13);

    /* setting main frame */
    main_frame = create_main_frame(1000, 750);

    /* setting commodty frames and button table */
    commodity_box = create_box(GTK_ORIENTATION_HORIZONTAL, 10);
    scrolled_window = create_scrolled_window();
    commodity_layout = create_layout(500, 700);
    commodity_grid = create_grid(10, 10);

    for (i = 0; i < 13; i++)
        for (j = 0; j < 13; j++) {
                commodity_button = create_commodity_button(&vending_machine -> commodity[i][j]);
            gtk_grid_attach( GTK_GRID(commodity_grid), commodity_button, i * 300, j * 300, 5, 7 );
        }

    /* start adding and packing */
    gtk_layout_put( GTK_LAYOUT(commodity_layout), commodity_grid, 10, 10 );
    gtk_container_add( GTK_CONTAINER(scrolled_window), commodity_layout );
    gtk_box_pack_start( GTK_BOX(commodity_box), scrolled_window, TRUE, TRUE, 10 );
    gtk_container_add( GTK_CONTAINER(main_frame), commodity_box );

    /* show all */
    gtk_widget_show_all(main_frame);

    gtk_main();

    return 0;
}

我已经完成了小型自动售货机项目所需的基本功能。

现在,我正在尝试使用GTK +从功能中创建UI。

,我很困惑

这是我第一次真正使用GTK。

我想要一个应该显示在左侧的商品按钮网格,但我得到了

几乎坚持这一部分。我想要做的是,因为我“malloc”编辑商品

为了添加和删除通信,我想要一个附加到通信窗口的滚动条。

我在源代码中看到的内容

  1. 我制作了一个通讯按钮网格,并添加到布局小部件上。
  2. 我在滚动条小部件上添加了布局
  3. 我在盒子上添加了滚动条并将其打包。
  4. 我将该框添加到主窗口。
  5. 结果很“不满意”

    我正在努力完成GNOME官方API

    有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

如果您没有看到如何创建用户界面,请尝试Glade。您将能够快速尝试查看小部件如何组合在一起。