📄 gtk_tut-9.html
字号:
int main( int argc, char *argv[] ){ /* GtkWidget is the storage type for widgets */ GtkWidget *window, *pixmapwid, *button; GdkPixmap *pixmap; GdkBitmap *mask; GtkStyle *style; /* create the main window, and attach delete_event signal to terminating the application */ 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_set_border_width( GTK_CONTAINER (window), 10 ); gtk_widget_show( window ); /* now for the pixmap from 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 ); /* a pixmap widget to contain the pixmap */ pixmapwid = gtk_pixmap_new( pixmap, mask ); gtk_widget_show( pixmapwid ); /* a button to contain the pixmap widget */ 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 ); /* show the window */ gtk_main (); return 0;}/* example-end */</PRE></CODE></BLOCKQUOTE><P>To load a file from an XPM data file called icon0.xpm in the currentdirectory, we would have created the pixmap thus<P><BLOCKQUOTE><CODE><PRE> /* load a pixmap from a 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>A disadvantage of using pixmaps is that the displayed object is alwaysrectangular, regardless of the image. We would like to create desktopsand applications with icons that have more natural shapes. Forexample, for a game interface, we would like to have round buttons topush. The way to do this is using shaped windows.<P>A shaped window is simply a pixmap where the background pixels aretransparent. This way, when the background image is multi-colored, wedon't overwrite it with a rectangular, non-matching border around ouricon. The following example displays a full wheelbarrow image on thedesktop.<P><BLOCKQUOTE><CODE><PRE>/* example-start wheelbarrow 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 "," "," "};/* When invoked (via signal delete_event), terminates the application */void close_application( GtkWidget *widget, GdkEvent *event, gpointer data ) { gtk_main_quit();}int main (int argc, char *argv[]){ /* GtkWidget is the storage type for widgets */ GtkWidget *window, *pixmap, *fixed; GdkPixmap *gdk_pixmap; GdkBitmap *mask; GtkStyle *style; GdkGC *gc; /* Create the main window, and attach delete_event signal to terminate * the application. Note that the main window will not have a titlebar * since we're making it a popup. */ 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); /* Now for the pixmap and the pixmap widget */ 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 ); /* To display the pixmap, we use a fixed widget to place the pixmap */ 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 ); /* This masks out everything except for the image itself */ gtk_widget_shape_combine_mask( window, mask, 0, 0 ); /* show the window */ gtk_widget_set_uposition( window, 20, 400 ); gtk_widget_show( window ); gtk_main (); return(0);}/* example-end */</PRE></CODE></BLOCKQUOTE><P>To make the wheelbarrow image sensitive, we could attach the buttonpress event signal to make it do something. The following few lineswould make the picture sensitive to a mouse button being pressed whichmakes the application terminate.<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><H2><A NAME="ss9.7">9.7 Rulers</A></H2><P>Ruler widgets are used to indicate the location of the mouse pointerin a given window. A window can have a vertical ruler spanning acrossthe width and a horizontal ruler spanning down the height. A smalltriangular indicator on the ruler shows the exact location of thepointer relative to the ruler.<P>A ruler must first be created. Horizontal and vertical rulers arecreated using<P><BLOCKQUOTE><CODE><PRE>GtkWidget *gtk_hruler_new( void ); /* horizontal ruler */GtkWidget *gtk_vruler_new( void ); /* vertical ruler */</PRE></CODE></BLOCKQUOTE><P>Once a ruler is created, we can define the unit of measurement. Unitsof measure for rulers can be GTK_PIXELS, GTK_INCHES orGTK_CENTIMETERS. This is set using<P><BLOCKQUOTE><CODE><PRE>void gtk_ruler_set_metric( GtkRuler *ruler, GtkMetricType metric );</PRE></CODE></BLOCKQUOTE><P>The default measure is GTK_PIXELS.<P><BLOCKQUOTE><CODE><PRE> gtk_ruler_set_metric( GTK_RULER(ruler), GTK_PIXELS );</PRE></CODE></BLOCKQUOTE><P>Other important characteristics of a ruler are how to mark the unitsof scale and where the position indicator is initially placed. Theseare set for a ruler using<P><BLOCKQUOTE><CODE><PRE>void gtk_ruler_set_range( GtkRuler *ruler, gfloat lower, gfloat upper, gfloat position, gfloat max_size );</PRE></CODE></BLOCKQUOTE><P>The lower and upper arguments define the extent of the ruler, andmax_size is the largest possible number that will be displayed.Position defines the initial position of the pointer indicator withinthe ruler.<P>A vertical ruler can span an 800 pixel wide window thus<P><BLOCKQUOTE><CODE><PRE> gtk_ruler_set_range( GTK_RULER(vruler), 0, 800, 0, 800);</PRE></CODE></BLOCKQUOTE><P>The markings displayed on the ruler will be from 0 to 800, with anumber for every 100 pixels. If instead we wanted the ruler to rangefrom 7 to 16, we would code<P><BLOCKQUOTE><CODE><PRE> gtk_ruler_set_range( GTK_RULER(vruler), 7, 16, 0, 20);</PRE></CODE></BLOCKQUOTE><P>The indicator on the ruler is a small triangular mark that indicatesthe position of the pointer relative to the ruler. If the ruler isused to follow the mouse pointer, the motion_notify_event signalshould be connected to the motion_notify_event method of the ruler.To follow all mouse movements within a window area, we would use<P><BLOCKQUOTE><CODE><PRE>#define EVENT_METHOD(i, x) GTK_WIDGET_CLASS(GTK_OBJECT(i)->klass)->x gtk_signal_connect_object( GTK_OBJECT(area), "motion_notify_event", (GtkSignalFunc)EVENT_METHOD(ruler, motion_notify_event), GTK_OBJECT(ruler) );</PRE></CODE></BLOCKQUOTE><P>The following example creates a drawing area with a horizontal rulerabove it and a vertical ruler to the left of it. The size of thedrawing area is 600 pixels wide by 400 pixels high. The horizontalruler spans from 7 to 13 with a mark every 100 pixels, while thevertical ruler spans from 0 to 400 with a mark every 100 pixels.Placement of the drawing area and the rulers is done using a table.<P><BLOCKQUOTE><CODE><PRE>/* example-start rulers rulers.c */#include <gtk/gtk.h>#define EVENT_METHOD(i, x) GTK_WIDGET_CLASS(GTK_OBJECT(i)->klass)->x#define XSIZE 600#define YSIZE 400/* This routine gets control when the close button is clicked */void close_application( GtkWidget *widget, GdkEvent *event, gpointer data ) { gtk_main_quit();}/* The main routine */int main( int argc, char *argv[] ) { GtkWidget *window, *table, *area, *hrule, *vrule;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -