luni, 5 ianuarie 2009

[IOM] GTK

GTK este o librarie pentru crearea de intertefe grafice. GTK este de fapt un API orientat pe obiect.Desi scrisa complet in C e implementata folosind idea de clase si functii de callback.

Compilarea unui program folosind gtk :

Pentru a compila aplicatii GTK+, avem un tool pkg-config care returneaza metadata despre librariile instalate.

gcc example.c -o example `pkg-config --cflags --libs gtk+-2.0`

Exemplu foarte simplu:

#include

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

gtk_init(&argc, &argv);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_show(window);

gtk_main();

return 0;
}


gtk_init(&arsgc,&argv); //initializarea librariei gtk

GtkWidget *window; //declara un GtkWindow widget

window = gtk_window_new(GTK_WINDOW_TOPLEVEL); //crearea unei fereastre de tipul GTK_WINDOW_TOPLEVEL acestea au bara de sus si margine.

gtk_widget_show(window);//afiseaza fereastra

gtk_main();//intra in loop-ul principal GTK+

In urma rularii se obtine fereastra:

















Acum voi arata exemple de ferestre pentru un Messenger folosind gtk:

Fereastra de sign-in:

GtkWidget *window;

GdkColor colorWindow;

colorWindow.red=204*256;
colorWindow.green=255*256;
colorWindow.blue=224*256;

gdk_color_parse ("honeydew2", &colorWindow); //culoarea de background a ferestrei

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

gtk_window_set_title(GTK_WINDOW(window),"Name"); //titlul ferestrei

gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);//pozitia ferestrei

gtk_window_set_icon_from_file (GTK_WINDOW window),"kite_icon2.jpg",NULL);
//adaug o imagine

//pun ca background culoarea
gtk_widget_modify_bg (window, GTK_STATE_NORMAL,&colorWindow);
gtk_widget_modify_bg (window, GTK_STATE_PRELIGHT, &colorWindow);

gtk_signal_connect (GTK_OBJECT (window), "destroy",
GTK_SIGNAL_FUNC (gtk_main_quit), NULL);

g_signal_connect (GTK_OBJECT (window), "delete_event",
GTK_SIGNAL_FUNC (gtk_main_quit), NULL);


Iata cum se creeaza un box vertical ce va contine tot si va fi continut apoi in window

GtkWidget *main_box;

main_box=gtk_vbox_new (FALSE, 0);
gtk_container_set_border_width (GTK_CONTAINER (main_box), 2);


Tabel 2x2:

GtkWidget *table;
table = gtk_table_new(6, 2, FALSE);
gtk_table_set_row_spacing(GTK_TABLE(table),0,80);
gtk_table_set_row_spacing(GTK_TABLE(table),2,20);
gtk_table_set_row_spacing(GTK_TABLE(table),3,60);
gtk_table_set_row_spacing(GTK_TABLE(table),4,200);

Adaugarea unei imagini:

image=gtk_image_new_from_file ("kite1.jpeg");

Crearea unui label:

sigin_lbl_username = gtk_label_new("Username:");
sigin_lbl_password = gtk_label_new("Password:");

Entry:

sigin_username_entry = gtk_entry_new();
sigin_password_entry = gtk_entry_new();

Entry care pentru password este ascuns

gtk_entry_set_visibility( (GtkEntry *)sigin_password_entry,
FALSE );

Crearea unui check button:

sigin_ckb_invisible=gtk_check_button_new_with_label ("Invizible for all");


Crearea unui buton de logare:

sigin_bt_signin = gtk_button_new ();

Aici se apeleaza functia de callback la click pe butunul de logare:

g_signal_connect (G_OBJECT (sigin_bt_signin), "clicked",
G_CALLBACK (sign_in), (gpointer) "cool button");

Userul poate declansa sign_in si dupa ce introduce parola si executa enter

g_signal_connect (G_OBJECT (sigin_password_entry), "activate",
G_CALLBACK (sign_in), (gpointer) "data");

box = xpm_label_box ("access_16x16.gif", "Sign In");
gtk_widget_show (box);

Adaug boxul la buton:

gtk_container_add (GTK_CONTAINER (sigin_bt_signin), box);
gtk_widget_show (sigin_bt_signin);

Link catre alta fereastra:

event_box = gtk_event_box_new ();
sigin_lbl_signup = gtk_label_new("New Account");
gtk_container_add (GTK_CONTAINER (event_box), sigin_lbl_signup);
gtk_event_box_set_visible_window (GTK_EVENT_BOX(event_box),FALSE);

gtk_widget_set_events (event_box, GDK_BUTTON_PRESS_MASK);
g_signal_connect (G_OBJECT (event_box), "button_press_event",
G_CALLBACK (cont_nou),NULL);

Adaugarea de elemente in tabel

gtk_table_attach(GTK_TABLE(table), image, 0, 2, 0, 1, 0, 0, 0, 0);
gtk_table_attach(GTK_TABLE(table), sigin_lbl_username, 0, 1, 1, 2, 0, 0, 0, 0);
gtk_table_attach(GTK_TABLE(table), sigin_lbl_password, 0, 1, 2, 3, 0, 0, 0, 0);
gtk_table_attach(GTK_TABLE(table), sigin_username_entry, 1, 2, 1, 2, 0, 0, 0, 0);
gtk_table_attach(GTK_TABLE(table), sigin_password_entry, 1, 2, 2, 3, 0, 0, 0, 0);
gtk_table_attach(GTK_TABLE(table), sigin_ckb_invisible, 1, 2, 3, 4, 0, 0, 0, 0);
gtk_table_attach(GTK_TABLE(table), sigin_bt_signin, 1, 2, 4, 5, 0, 0, 0, 0);
gtk_table_attach(GTK_TABLE(table), event_box, 1, 2, 5, 6, 0, 0, 0, 0);

Toate elementele adaugate sunt vizibile

gtk_widget_show(table);
gtk_widget_show(sigin_username_entry);
gtk_widget_show(sigin_password_entry);
gtk_widget_show(sigin_lbl_username);
gtk_widget_show(sigin_lbl_password);
gtk_widget_show(sigin_lbl_signup);
gtk_widget_show(image);
gtk_widget_show(sigin_ckb_invisible);
gtk_widget_show(event_box);

gtk_container_add(GTK_CONTAINER(main_box), table);

Seteaza marginile:

gtk_container_set_border_width (GTK_CONTAINER (window),50);

Adaugarea vertical box la fereastra

gtk_widget_show (main_box);
gtk_container_add (GTK_CONTAINER (window), main_box);

Se obtine:




















Niciun comentariu: