2011-08-05 7 views
1
#include <stdio.h> 
#include <stdlib.h> 
#include <gtk/gtk.h> 

/*Devo fare un pulsante che, una volta premuto, legga 
* i due numeri e ne calcoli l'MCD*/ 

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

    GtkWidget *window; 
    GtkWidget *table; 

    GtkWidget *label1; 
    GtkWidget *label2; 
    GtkWidget *label3; 

    GtkWidget *num1; 
    GtkWidget *num2; 
    GtkWidget *mcdt; 

    GtkWidget *button; 

    gtk_init(&argc, &argv); 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); 
    gtk_window_set_title(GTK_WINDOW(window), "MCD Calculator"); 
    gtk_container_set_border_width(GTK_CONTAINER(window), 10); 

    table = gtk_table_new(4, 4, FALSE); 

    gtk_container_add(GTK_CONTAINER(window), table); 

    label1 = gtk_label_new("Num1"); 
    label2 = gtk_label_new("Num2"); 
    label3 = gtk_label_new("MCD"); 

    gtk_table_attach(GTK_TABLE(table), label1, 0, 1, 0, 1, GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK,5, 5); 
    gtk_table_attach(GTK_TABLE(table), label2, 0, 1, 1, 2, GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK,5, 5); 
    gtk_table_attach(GTK_TABLE(table), label3, 0, 1, 3, 4, GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK,5, 5); 

    num1 = gtk_entry_new(); 
    num2 = gtk_entry_new(); 
    mcdt = gtk_entry_new(); 

    gtk_table_attach(GTK_TABLE(table), num1, 1, 2, 0, 1, GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK, 5, 5); 
    gtk_table_attach(GTK_TABLE(table), num2, 1, 2, 1, 2, GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK, 5, 5); 
    gtk_table_attach(GTK_TABLE(table), mcdt, 1, 2, 3, 4, GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK, 5, 5); 

    button = gtk_button_new_with_label ("Calcola MCD"); 
    gtk_container_add(GTK_CONTAINER(window), button); 
    gtk_table_attach(GTK_TABLE(table), button, 1, 5, 2, 3, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); 
    //g_signal_connect (button, "clicked", G_CALLBACK (callback), (gpointer) "Calcola"); 

    gtk_widget_show_all(window); 

    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); 

    gtk_main(); 

    return EXIT_SUCCESS; 
} 

이 코드는 나에게이 경고를 제공합니다.GTK의 VBox의 또는 hbox에

답변

2

상자 위젯을 사용하면 여러 하위 위젯을 가로 또는 세로로 추가 할 수 있습니다. 테이블 위젯은 비슷하지만 2 차원 격자 레이아웃을 허용합니다. 즉, hbox 및 vbox는 이미 사용중인 테이블의 단순화 된 버전입니다.

상자를 사용하려면 hbox 또는 vbox를 만들어 창에 추가하기 만하면됩니다.

GtkWidget * box = gtk_hbox_new(0,0); 
gtk_container_add(GTK_CONTAINER(window),box); 

이제 테이블과 버튼을 창 대신 상자에 추가하십시오. 당신은 당신이 두 개의 서로 다른 컨테이너에 버튼을 추가 게시 된 코드에서

gtk_container_add(GTK_CONTAINER(box), table); 
gtk_container_add(GTK_CONTAINER(box), button); 

. 다음 줄 중 하나를 해제해야합니다. gtk_container_add()로 라인을 비활성화하면 버튼을 기존 테이블에 추가하기 때문에 실제로 상자를 사용할 필요가 없습니다.

gtk_container_add(GTK_CONTAINER(box), button); 
gtk_table_attach(GTK_TABLE(table), button, 1, 5, 2, 3, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); 

콜백을 작성하는 것이 흥미롭고 도움이 될 것이라고 생각했습니다.

void callback() 
    { 
    const gchar * s1 = gtk_entry_get_text(GTK_ENTRY(num1)); 
    const gchar * s2 = gtk_entry_get_text(GTK_ENTRY(num2)); 
    int n1 = atoi(s1), n2=atoi(s2); 
    n1=abs(n1), n2=abs(n2); // GCD defined to return non-negative value 
    int i; for (i=(n1>n2?n1:n2); i>=1; i--) if (n1/i*i==n1 && n2/i*i==n2) break; 
    char s3[32]; snprintf(s3,32,"%d",i); 
    gtk_entry_set_text(GTK_ENTRY(mcdt),s3); 
    } 

다음은 hbox와 비슷합니다. 버튼이 테이블 옆에 수평으로 놓여 있습니다.

enter image description here

+0

고마워요 :) – polslinux

+0

중 VBOX/HBox의에 대한 현재 문서는 말한다 : "상자는 결국 사라질 것이기 때문에 사용이 매우 쉽고 빠르게 변화 대신 상자, 그러나 우리는 그리드로 전환하는 것이 좋습니다. . " 여기를 보시오 : [박스/그리드로 HBox/VBox를 어떻게 대체합니까?] (http://stackoverflow.com/questions/19532619/how-do-you-replace-hbox-vbox-with-box-grid) – nobar