/*---------------------------------------------------------------------- (c) 2004 przemek kramarczyk kompilowac poleceniem: gcc -s programik.c -o programik `pkg-config gtk+-2.0 --cflags --libs` uruchamiamy: ./programik formatowanie kodu jest wynikiem dzialania programu "indent" ----------------------------------------------------------------------*/ #include /* tutaj sa prototypy funkcji i makra GTK+ */ #include /* tutaj jest definicja liczby PI i funkcji pow() */ #include /* potrzebujemy funkcji sprintf() */ #include /* atof(), atoi() */ void licz(void); void kasuj(void); void koniec(void); int buduj_interfejs(void); /* GtkWidget* jest typem danych gtk. Prawie kazdy element widoczny na ekranie jest tego typu. */ GtkWidget *okno, *ramka, *tabela, *pole_srednica, *pole_skok, *pole_ilosc_cylindrow, *pole_wynik, *przycisk_licz, *przycisk_resetuj; int main(int argc, char **argv) { gtk_init(&argc, &argv); /* inicjalizacja gtk */ buduj_interfejs(); /* nasza funkcja tworzaca interfejs programu */ gtk_main(); /* glowna petla gtk */ return (0); } /* Funkcja buduj_interfejs() */ int buduj_interfejs() { /* otwieramy nowe okno i okreslamy jego typ (TOPLEVEL) */ okno = gtk_window_new(GTK_WINDOW_TOPLEVEL); /* ustawiamy tytul okna "okno" */ gtk_window_set_title(GTK_WINDOW(okno), "programik"); /* zabezpieczamy sie przed zmiana rozmiaru okna (FALSE) */ gtk_window_set_resizable(GTK_WINDOW(okno), FALSE); /* ustawiamy nasze okno na srodku ekranu. */ gtk_window_set_position(GTK_WINDOW(okno), GTK_WIN_POS_CENTER); /* tworzymy ramke bez opisu (NULL) */ ramka = gtk_frame_new(NULL); /* wstawiamy ramke do okna (kontenera) */ gtk_container_add(GTK_CONTAINER(okno), ramka); /* ustawiamy odleglosc miedzy krawedzia okna a ramka */ gtk_container_set_border_width(GTK_CONTAINER(okno), 5); /* tworzymy tabele o 6 wierszach i 5 kolumnach */ tabela = gtk_table_new(6, 5, 0); /* wstawiamy tabele do ramki */ gtk_container_add(GTK_CONTAINER(ramka), tabela); /* wstawiamy etykiete tekstowa do tabeli na pozycji w kolumnie (1, 2) i wierszu (1, 2) */ gtk_table_attach_defaults(GTK_TABLE(tabela), gtk_label_new("srednica cylindra (mm)"), 1, 2, 1, 2); /* tworzymy pole dialogowe dla wpisania srednicy cylindra. */ pole_srednica = gtk_entry_new(); /* dolaczamy pole dialogowe do tabeli na pozycjach 1,2 i 2,3 */ gtk_table_attach_defaults(GTK_TABLE(tabela), pole_srednica, 1, 2, 2, 3); /* tworzymy etykiete tekstowa. */ gtk_table_attach_defaults(GTK_TABLE(tabela), gtk_label_new("skok tloka (mm)"), 1, 2, 3, 4); /* tworzymy pole dialogowe dla wpisania skoku tloka. */ pole_skok = gtk_entry_new(); gtk_table_attach_defaults(GTK_TABLE(tabela), pole_skok, 1, 2, 4, 5); /* dolaczamy pole dialogowe do tabeli na pozycjach 4,5 1,2. */ przycisk_licz = gtk_button_new_with_label(" oblicz "); /* tworzymy przycisk z etykieta. */ gtk_table_attach_defaults(GTK_TABLE(tabela), przycisk_licz, 2, 3, 4, 5); /* podlaczamy guzik do funkcji "licz()". */ g_signal_connect(G_OBJECT(przycisk_licz), "clicked", G_CALLBACK(licz), NULL); przycisk_resetuj = gtk_button_new_with_label(" skasuj "); gtk_table_attach_defaults(GTK_TABLE(tabela), przycisk_resetuj, 2, 3, 2, 3); g_signal_connect(G_OBJECT(przycisk_resetuj), "clicked", G_CALLBACK(kasuj), NULL); gtk_table_attach_defaults(GTK_TABLE(tabela), gtk_label_new("ilosc cylindrow"), 3, 4, 1, 2); pole_ilosc_cylindrow = gtk_entry_new(); gtk_table_attach_defaults(GTK_TABLE(tabela), pole_ilosc_cylindrow, 3, 4, 2, 3); gtk_table_attach_defaults(GTK_TABLE(tabela), gtk_label_new("wynik (cm^3)"), 3, 4, 3, 4); pole_wynik = gtk_entry_new(); /* ustawiamy niemoznosc edycji pola "wynik" */ gtk_entry_set_editable(GTK_ENTRY(pole_wynik), FALSE); /* poprawka dla gtk+-3.0 g_object_set(G_OBJECT(pole_wynik), "editable", FALSE, NULL); */ gtk_table_attach_defaults(GTK_TABLE(tabela), pole_wynik, 3, 4, 4, 5); g_signal_connect(G_OBJECT(okno), "destroy", G_CALLBACK(koniec), NULL); /* ustawiamy odleglosc miedzy wierszami tabeli */ gtk_table_set_row_spacings(GTK_TABLE(tabela), 5); /* ustawiamy odleglosc miedzy kolumnami tabeli */ gtk_table_set_col_spacings(GTK_TABLE(tabela), 8); /* pokazujemy wszystkie widgety w oknie. */ gtk_widget_show_all(okno); return (0); } /* funkcja koniec() */ void koniec() { gtk_main_quit(); return; } /* funkcja kasuj() */ void kasuj() { const char N[] = "\0"; gtk_entry_set_text(GTK_ENTRY(pole_srednica), N); gtk_entry_set_text(GTK_ENTRY(pole_skok), N); gtk_entry_set_text(GTK_ENTRY(pole_ilosc_cylindrow), N); gtk_entry_set_text(GTK_ENTRY(pole_wynik), N); return; } /* funkcja licz() */ void licz() { int ile_cyl = 0; const char *c_ile_cyl, *c_srednica, *c_skok; char *c_wynik; float skok, wynik; skok = wynik = 0; c_skok = gtk_entry_get_text(GTK_ENTRY(pole_skok)); c_srednica = gtk_entry_get_text(GTK_ENTRY(pole_srednica)); c_ile_cyl = gtk_entry_get_text(GTK_ENTRY(pole_ilosc_cylindrow)); skok = atof(c_skok); ile_cyl = atoi(c_ile_cyl); wynik = (((M_PI * pow(atof(c_srednica)/2, 2) * skok) * ile_cyl) / 1000); c_wynik = (char *) malloc(32 * sizeof(char *)); if(c_wynik==NULL) { exit(EXIT_FAILURE); } sprintf(c_wynik, "%g", wynik); gtk_entry_set_text(GTK_ENTRY(pole_wynik), c_wynik); free(c_wynik); return; }