C(99) gtk   03 - le immagini
Upcoming SlideShare
Loading in...5
×
 

C(99) gtk 03 - le immagini

on

  • 260 views

Utilizzo delle Immagini con le librerie GTK

Utilizzo delle Immagini con le librerie GTK

Statistics

Views

Total Views
260
Views on SlideShare
260
Embed Views
0

Actions

Likes
0
Downloads
5
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

C(99) gtk   03 - le immagini C(99) gtk 03 - le immagini Presentation Transcript

  • * http://corsogtk.chipsy.it/ Le immagini
  • *
  • * Piccola parentesi prima di parlare dei pixbuf :Magari non avete ancora provato adocumentarmi sulle gtk su altre fonti ma sel’avete fatto sicuramente avrete notato chealcune funzioni iniziano per gtk_ e altre pergdk_Questo è perché esistono 2 livelli di astrazione,le gdk son la parte che gestisce i dati, le gtkquella che li mostra a video.Se volete salvarvi 10 o 20 immagini in memoriausate le gdk, se le volete mostrare, magari unaalla volta usate le gtk
  • * I Pixbuf altro non sono che contenitori di immagini, hanno molte funzioni per la manipolazione di immagini, reggono quasi tutti i tipi di immagini (png,jpg,bmp,gif,etc..)* Facendo parte della libreria gdk (e non gtk) per dichiararli hanno un loro tipo e non si usa GtkWidget.GdkPixbuf *esempio;
  • * Il Pixbuf può essere creato essenzialmente in 2 modi :1. Creando un pixbuf vuoto : Immagine = gdk_pixbuf_new(GDK_COLORSPACE_RGB,TRUE,8, Larghezza,Altezza); I primi 3 parametri son standard, gli ultimi 2 son le dimensioni del pixbuf2. Caricando un’immagine : Immagine = gdk_pixbuf_new_from_file("Nome_file.png",&error); Per semplicità e possibile mettere NULL al posto di error, se si usa error, se l’immagine non viene caricata troveremmo in error->code e in error- >message informazioni sull’errore (GdkError *error)
  • * Tra le funzioni più utili che possiamo trovare con i pixbuf c’ègdk_pixbuf_copy_area(PixbufProvenienza,left,top,larghezza,altezza,PixbufDestinazione,top,left);Questa funzione copia un pezzo di immagine dalla primaimmagine (parametro 1), il pezzo copiato inizia allecoordinate left,top (2° e 3°) ed è grandelarghezza,altezza (4° e 5°).Questo pezzo lo andiamo a incollare nella secondaimmagine (parametro 6) alle coordinate top,left (7° e8°)L’utilità di questa funzione è quella di permetterci dicreare set di immagini, in questo modo possiamocaricare una solo immagine e poi spezzettarla in piùPixBuf (o in una matrice o vettore di pixbuf)
  • * Continuare a parlare dei pixbuf poteva diventare fuorviante cosi ho esposte solo le funzioni più utili per il momento.* Per approfondire : * http://developer.gnome.org/gdk-pixbuf/stable/
  • *
  • * Per poter mostrare le immagini a schermo possiamo avvalerci delle GtkImage.Fanno parte della libreria principale quindi son sempre deiwidget (come ogni componente visuale che vedremmo inqueste slide).Per crearle abbiamo :* image = gtk_image_new(); Crea una nuova immagine vuota;* image = gtk_image_new_from_file("nomefile.png"); Crea una nuova immagine caricandola da un file;* image = gtk_image_new_from_pixbuf(nomepixbuf); Crea una nuova immagine caricandola da pixbuf
  • * Possiamo cambiare il contenuto di un’immagine in qualunque momento avvalendoci delle funzioni :* gtk_image_set_from_file(image,"nomefile.png"); Carica il contenuto del file nell’immagine* gtk_image_set_from_pixbuf(image,nomepixbuf); Carica il contenuto del pixbuf nell’immagine
  • *
  • * In questo esempio vogliamo creare il famoso gioco forza 4.Verifichiamo cosa ci serve :1. Saper creare un programma con le gtk2. Saper gestire il click del mouse (dobbiamo sapere dove clicka l’utente)3. Saper caricare le immagini del gettone rosso e giallo4. Saper creare nuove immagini e farle cadere
  • * Bene la prima parte sappiamo farla, l’abbiamo vista nella prima lezione.* Quindi scriviamo questo codice :#include <gtk/gtk.h>int main(int argc,char *argv[]) { GtkWidget *win; //Inizializzo le GTK gtk_init (&argc, &argv); //Creo la finestra win = gtk_window_new(GTK_WINDOW_TOPLEVEL); //Imposto che quando la finestra viene chiusa devechiudersi il programma g_signal_connect(GTK_OBJECT(win), "destroy", G_CALLBACK( gtk_main_quit ), NULL); //Imposto le dimensioni della finestra gtk_widget_set_size_request (win,640,480); //Mostro la finestra e tutto il suo contenuto gtk_widget_show_all(win); //Avvio il loop principale delle GTK} gtk_main (); return 0; *
  • * Per la seconda dobbiamo riuscire a recepire il click del mouse..static gboolean mouse_click(GtkWidget*widget,GdkEventButton *event,gpointer user_data) { return TRUE;}int main(int argc,char *argv[]) { … win = gtk_window_new(GTK_WINDOW_TOPLEVEL); //Predispongo la finestra per ricevere i click delmouse gtk_widget_set_events(GTK_WIDGET(win),gtk_widget_get_events(win) | GDK_BUTTON_PRESS_MASK); //Chiedo di essere avvertito quando viene premuto untasto del mouse g_signal_connect(GTK_OBJECT(win), "button-press-event",G_CALLBACK ( mouse_click ), NULL); *
  • * Ora dobbiamo caricare i 2 gettoni e l’immagine di sfondoGdkPixbuf *rosso,*giallo,*griglia;int main(int argc,char *argv[]) { rosso =gdk_pixbuf_new_from_file("rosso.png",NULL); giallo =gdk_pixbuf_new_from_file("giallo.png",NULL); griglia =gdk_pixbuf_new_from_file("griglia.png",NULL); *
  • * Se vogliamo vedere le immagini cadere dobbiamo poterle creare dove vogliamo, per questo motivo metto un fixed nella finestraGtkFixed *contenitore;int main(int argc,char *argv[]) { … //Creo il fixed contenitore = gtk_fixed_new(); //Lo metto nella finestragtk_container_add(GTK_CONTAINER(win),contenitore); *
  • * Ora che abbiamo il fixed possiamo passare a creare le immagini, però dobbiamo sapere dove devono finire quindi ci serve una matrice che contenga il campo, e un intero che indichi di chi è il turnoint campo[15][20] ,turno=0; //640x480 con imms da32x32int main(int argc,char *argv[]) { int i=0,j; … //inizializzo la matrice for (;i<15;i++) for (j=0;j<20;j++) campo[i][j] = 0; *
  • * Tutto è fatto nella funzione che riceve il click del mouse possiamo creare le immagini e metterle al loro postostatic gboolean mouse_click(GtkWidget *widget,GdkEventButton *event,gpointer user_data) { //Divido le coordinate per 32 in modo da averle secondo la base della matrice int i,x = trunc(event->x/32); //Creo unimmagine (alternando il colore in base al turno) GdkImage *imm = gtk_image_new_from_pixbuf((turno)?rosso:giallo); //Controllo che la colonna non sia piena if (!campo[0][x]) { //Scorro la colonna dal basso allalto for (i=14;i>=0;i--) if (!campo[i][x]) break; //Esco quando trovo un punto libero //Incremento il turno turno = (turno+1)%2; //Setto che la cella ora è piena campo[i][x] = turno+1; //Metto il gettone li gtk_fixed_put(GTK_FIXED(contenitore),imm,x*32,i*32); //Mostro limmagine altrimenti non si vedrà gtk_widget_show(imm); } * return TRUE;}
  • *