📄 gtk_tut_it-7.html
字号:
le risorse di una pixmap hanno significato solo nel contesto dello schermo in cui deve essere mostrata.<P><BLOCKQUOTE><CODE><PRE>GdkPixmap* gdk_pixmap_create_from_data( GdkWindow *window, gchar *data, gint width, gint height, gint depth, GdkColor *fg, GdkColor *bg );</PRE></CODE></BLOCKQUOTE><P>Questa è usata per creare una pixmap con la profondità data (depth, ossia numero di colori) usando i dati specificati. fg e bg indicano i colori dausare per il primo piano e per lo sfondo.<P><BLOCKQUOTE><CODE><PRE>GdkPixmap* gdk_pixmap_create_from_xpm( GdkWindow *window, GdkBitmap **mask, GdkColor *transparent_color, const gchar *filename );</PRE></CODE></BLOCKQUOTE><P>Il formato XPM è una rappresentazione di pixmap leggibile per X Window. E' unarappresentazione molto diffusa, e sono disponibili parecchi programmi per creareimmagini in questo formato. Il file specificato da ``filename'' deve contenereun'immagine in questo formato, che viene caricato nella struttura pixmap.La maschera (mask) specifica quali pixel della pixmap devono essere opachi.Tutti gli altri pixel sono colorati usando il colore specificato datransparent_color. Più sotto mostreremo un esempio di uso di questa funzione.<P><BLOCKQUOTE><CODE><PRE>GdkPixmap* gdk_pixmap_create_from_xpm_d (GdkWindow *window, GdkBitmap **mask, GdkColor *transparent_color, gchar **data);</PRE></CODE></BLOCKQUOTE><P>Si possono incorporare piccole immagini all'interno di un programma sottoforma di dati in formato XPM. In questo modo, invece di leggerli da un file,si possono usare questi dati per creare una pixmap. Un esempio di questo tipodi dati è<P><BLOCKQUOTE><CODE><PRE>/* XPM */static const char * xpm_data[] = {"16 16 3 1"," c None",". c #000000000000","X c #FFFFFFFFFFFF"," "," ...... "," .XXX.X. "," .XXX.XX. "," .XXX.XXX. "," .XXX..... "," .XXXXXXX. "," .XXXXXXX. "," .XXXXXXX. "," .XXXXXXX. "," .XXXXXXX. "," .XXXXXXX. "," .XXXXXXX. "," ......... "," "," "};</PRE></CODE></BLOCKQUOTE><P><BLOCKQUOTE><CODE><PRE>void gdk_pixmap_destroy( GdkPixmap *pixmap );</PRE></CODE></BLOCKQUOTE><P>Quando abbiamo finito di usare una pixmap e pensiamo di non doverla riutilizzarepresto, è una buona idea liberare queste risorse usando la funzione dk_pixmap_destroy. Le pixmap devono essere considerate una risorsa preziosa.<P>Quando abbiamo creato una pixmap, possiamo mostrarla come un widget GTK.E' necessario creare un widget pixmap che contenga una pixmap GDK. Questaoperazione viene compiuta usando<P><BLOCKQUOTE><CODE><PRE>GtkWidget* gtk_pixmap_new( GdkPixmap *pixmap, GdkBitmap *mask );</PRE></CODE></BLOCKQUOTE><P>Le altre chiamate per i widget pixmap sono<P><BLOCKQUOTE><CODE><PRE>guint gtk_pixmap_get_type( void );void gtk_pixmap_set( GtkPixmap *pixmap, GdkPixmap *val, GdkBitmap *mask);void gtk_pixmap_get( GtkPixmap *pixmap, GdkPixmap **val, GdkBitmap **mask);</PRE></CODE></BLOCKQUOTE><P>La funzione gtk_pixmap_set viene usata per cambiare la pixmap che vienegestita correntemente dal widget.gtk_pixmap_set is used to change the pixmap that the widget is currentlymanaging. ``val'' è la pixmap che è stata creata usando il GDK.Segue un esempio di uso di una pixmap in un bottone.<P><BLOCKQUOTE><CODE><PRE>/* pixmap.c */#include <gtk/gtk.h>/* dat XPM dell'icona Apri File */static const char * xpm_data[] = {"16 16 3 1"," c None",". c #000000000000","X c #FFFFFFFFFFFF"," "," ...... "," .XXX.X. "," .XXX.XX. "," .XXX.XXX. "," .XXX..... "," .XXXXXXX. "," .XXXXXXX. "," .XXXXXXX. "," .XXXXXXX. "," .XXXXXXX. "," .XXXXXXX. "," .XXXXXXX. "," ......... "," "," "};/* quando invocata (con il segnale delete_event), termina l'applicazione. */void close_application( GtkWidget *widget, gpointer data ) { gtk_main_quit();}/* invocata se il bottone è clickato. Stampa semplicemente un messaggio */void button_clicked( GtkWidget *widget, gpointer data ) { printf( "button clicked\n" );}int main( int argc, char *argv[] ){ /* i widget sono memorizzati nel tipo GtkWidget */ GtkWidget *window, *pixmapwid, *button; GdkPixmap *pixmap; GdkBitmap *mask; GtkStyle *style; /* crea la finestra principale, e collega il segnale delete_event alla terminazione dell'applicazione */ gtk_init( &argc, &argv ); window = gtk_window_new( GTK_WINDOW_TOPLEVEL ); gtk_signal_connect( GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (close_application), NULL ); gtk_container_border_width( GTK_CONTAINER (window), 10 ); gtk_widget_show( window ); /* la pixmap proviene da gdk */ style = gtk_widget_get_style( window ); pixmap = gdk_pixmap_create_from_xpm_d( window->window, &mask, &style->bg[GTK_STATE_NORMAL], (gchar **)xpm_data ); /* un widget pixmap per contenere la pixmap */ pixmapwid = gtk_pixmap_new( pixmap, mask ); gtk_widget_show( pixmapwid ); /* un bottone per contenere il widget pixmap */ button = gtk_button_new(); gtk_container_add( GTK_CONTAINER(button), pixmapwid ); gtk_container_add( GTK_CONTAINER(window), button ); gtk_widget_show( button ); gtk_signal_connect( GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(button_clicked), NULL ); /* mostra la finestra */ gtk_main (); return 0;}</PRE></CODE></BLOCKQUOTE><P><P>Per caricare una pixmap da un file XPM chiamato icon0.xpm che si trovanella direttorio corrente, avremmo creato la pixmap in questo modo:<P><BLOCKQUOTE><CODE><PRE> /* carica una pixmap da un file */ pixmap = gdk_pixmap_create_from_xpm( window->window, &mask, &style->bg[GTK_STATE_NORMAL], "./icon0.xpm" ); pixmapwid = gtk_pixmap_new( pixmap, mask ); gtk_widget_show( pixmapwid ); gtk_container_add( GTK_CONTAINER(window), pixmapwid );</PRE></CODE></BLOCKQUOTE><P><P>Usare le Sagome<P>Uno degli svantaggi di usare le pixmap è costituito dal fatto che l'oggettomostrato è sempre rettangolare, a prescindere dall'immagine. Ci piacerebbeinvece poter crare dei desktop e delle immagini con forme più naturali. Peresempio, per l'interfaccia di un gioco, potremmo volere avere dei pulsanticircolari. Il modo per ottenere questo effetto è di usare delle finestresagomate.<P>Una finestra sagomata è semplicemente una pixmap in cui i pixel dellosfondo sono trasparenti. In questo modo, se l'immagine di sfondo è multicolore, possiamo evitare di sovrascriverla con un bordo rettangolareattorno all'icona. Il prossimo esempio mostra una carriola sul desktop.<P><BLOCKQUOTE><CODE><PRE>/* wheelbarrow.c */#include <gtk/gtk.h>/* XPM */static char * WheelbarrowFull_xpm[] = {"48 48 64 1"," c None",". c #DF7DCF3CC71B","X c #965875D669A6","o c #71C671C671C6","O c #A699A289A699","+ c #965892489658","@ c #8E38410330C2","# c #D75C7DF769A6","$ c #F7DECF3CC71B","% c #96588A288E38","& c #A69992489E79","* c #8E3886178E38","= c #104008200820","- c #596510401040","; c #C71B30C230C2",": c #C71B9A699658","> c #618561856185",", c #20811C712081","< c #104000000000","1 c #861720812081","2 c #DF7D4D344103","3 c #79E769A671C6","4 c #861782078617","5 c #41033CF34103","6 c #000000000000","7 c #49241C711040","8 c #492445144924","9 c #082008200820","0 c #69A618611861","q c #B6DA71C65144","w c #410330C238E3","e c #CF3CBAEAB6DA","r c #71C6451430C2","t c #EFBEDB6CD75C","y c #28A208200820","u c #186110401040","i c #596528A21861","p c #71C661855965","a c #A69996589658","s c #30C228A230C2","d c #BEFBA289AEBA","f c #596545145144","g c #30C230C230C2","h c #8E3882078617","j c #208118612081","k c #38E30C300820","l c #30C2208128A2","z c #38E328A238E3","x c #514438E34924","c c #618555555965","v c #30C2208130C2","b c #38E328A230C2","n c #28A228A228A2","m c #41032CB228A2","M c #104010401040","N c #492438E34103","B c #28A2208128A2","V c #A699596538E3","C c #30C21C711040","Z c #30C218611040","A c #965865955965","S c #618534D32081","D c #38E31C711040","F c #082000000820"," "," .XoO "," +@#$%o& "," *=-;#::o+ "," >,<12#:34 "," 45671#:X3 "," +89<02qwo ","e* >,67;ro ","ty> 459@>+&& ","$2u+ ><ipas8* ","%$;=* *3:.Xa.dfg> ","Oh$;ya *3d.a8j,Xe.d3g8+ "," Oh$;ka *3d$a8lz,,xxc:.e3g54 "," Oh$;kO *pd$%svbzz,sxxxxfX..&wn> "," Oh$@mO *3dthwlsslszjzxxxxxxx3:td8M4 "," Oh$@g& *3d$XNlvvvlllm,mNwxxxxxxxfa.:,B* "," Oh$@,Od.czlllllzlmmqV@V#V@fxxxxxxxf:%j5& "," Oh$1hd5lllslllCCZrV#r#:#2AxxxxxxxxxcdwM* "," OXq6c.%8vvvllZZiqqApA:mq:Xxcpcxxxxxfdc9* "," 2r<6gde3bllZZrVi7S@SV77A::qApxxxxxxfdcM "," :,q-6MN.dfmZZrrSS:#riirDSAX@Af5xxxxxfevo"," +A26jguXtAZZZC7iDiCCrVVii7Cmmmxxxxxx%3g"," *#16jszN..3DZZZZrCVSA2rZrV7Dmmwxxxx&en"," p2yFvzssXe:fCZZCiiD7iiZDiDSSZwwxx8e*>"," OA1<jzxwwc:$d%NDZZZZCCCZCCZZCmxxfd.B "," 3206Bwxxszx%et.eaAp77m77mmmf3&eeeg* "," @26MvzxNzvlbwfpdettttttttttt.c,n& "," *;16=lsNwwNwgsvslbwwvccc3pcfu<o "," p;<69BvwwsszslllbBlllllllu<5+ "," OS0y6FBlvvvzvzss,u=Blllj=54 "," c1-699Blvlllllu7k96MMMg4 "," *10y8n6FjvllllB<166668 "," S-kg+>666<M<996-y6n<8* "," p71=4 m69996kD8Z-66698&& "," &i0ycm6n4 ogk17,0<6666g "," N-k-<> >=01-kuu666> "," ,6ky& &46-10ul,66, "," Ou0<> o66y<ulw<66& "," *kk5 >66By7=xu664 "," <<M4 466lj<Mxu66o "," *>> +66uv,zN666* "," 566,xxj669 "," 4666FF666> "," >966666M "," oM6668+ "," *4 "," "," "};/* quando invocata (con il segnale delete_event), termina l'applicazione. */void close_application( GtkWidget *widget, gpointer data ) { gtk_main_quit();}int main (int argc, char *argv[]){ /* il tipo di dato per i widget è GtkWidget */ GtkWidget *window, *pixmap, *fixed; GdkPixmap *gdk_pixmap; GdkBitmap *mask; GtkStyle *style; GdkGC *gc; /* crea la finestra principale e collega il segnale delete_event per terminare l'applicazione. Notare che non mettiamo un titolo alla finestra. */ gtk_init (&argc, &argv); window = gtk_window_new( GTK_WINDOW_POPUP ); gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (close_application), NULL); gtk_widget_show (window); /* ora occupiamoci della pixmap e del widget pixmap */ style = gtk_widget_get_default_style(); gc = style->black_gc; gdk_pixmap = gdk_pixmap_create_from_xpm_d( window->window, &mask, &style->bg[GTK_STATE_NORMAL], WheelbarrowFull_xpm ); pixmap = gtk_pixmap_new( gdk_pixmap, mask ); gtk_widget_show( pixmap ); /* Per mostrare la pixmap, usiamo un widget "fixed" in cui metterla */ fixed = gtk_fixed_new(); gtk_widget_set_usize( fixed, 200, 200 ); gtk_fixed_put( GTK_FIXED(fixed), pixmap, 0, 0 ); gtk_container_add( GTK_CONTAINER(window), fixed ); gtk_widget_show( fixed ); /* Questa maschera tutto tranne l'immagine stessa */ gtk_widget_shape_combine_mask( window, mask, 0, 0 ); /* mostra la finestra */ gtk_widget_set_uposition( window, 20, 400 ); gtk_widget_show( window ); gtk_main (); return 0;}</PRE></CODE></BLOCKQUOTE><P>Per rendere sensibile l'immagine della carriola, potremmo collegareil segnale di pressione del bottone in modo che venga compiuta una certaazione. Le prossime linee renderebbero l'immagine sensibile alla pressionedi un bottone del mouse che fa sì che l'applicazione termini.<P><BLOCKQUOTE><CODE><PRE>gtk_widget_set_events( window, gtk_widget_get_events( window ) | GDK_BUTTON_PRESS_MASK );gtk_signal_connect( GTK_OBJECT(window), "button_press_event", GTK_SIGNAL_FUNC(close_application), NULL );</PRE></CODE></BLOCKQUOTE><P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -