http://blog.163.com/xy_god/blog/static/9148351200781741423827/
啊,啊啊,這麼簡單!趕快做個橢圓的按鈕出來看看!修改61行代碼如下:
61 gtk_widget_shape_combine_mask (button, window_shape_bitmap, 0, 0);
編譯運行,鬱悶,毫無效果!難道只能製作出不規則的TOPLEVEL視窗!這是為什麼呢?又該如何解決呢?讓我
們繼續百度,Google,很不幸,根本找不到這方面的文章!鬱悶了!
別絕望,讓我們回頭再次在終端中運行我們剛剛修改的樣本程式,啊,終端中有提示:
(test:2079): Gtk-CRITICAL **: gtk_widget_shape_combine_mask: assertion `!GTK_WIDGET_NO_WINDOW (widget)' failed
恩,這是說button是一個NO_WINDOW的控制項!也就是說,我們需要為gtk_widget_shape_combine_mask提供
一個有WINDOW的視窗!所謂有WINDOW的視窗,就是擁有gdk window的視窗!如果你不太明白這句話的意思,那你
再努力學習一下GTK+吧!
不過,GTK+中哪個控制項才是擁有gdk window的視窗呢?鬱悶,這麼多控制項,隨便嘗試幾個控制項吧,恩,hbox
不是,Gtk Bin也不是,啊,GtkEntry是!不信,你可以把樣本程式中的button用一個GtkEntry執行個體來代替!還有
,GtkTextView也是!
如果你想製作一個圓形按鈕,那就用GtkTextView作為GtkButton的父視窗,然後把GtkTextView執行個體作為參
數傳遞給gtk_widget_shape_combine_mask函數吧!
恩,GtkTextView作為一個父視窗來製作圓形按鈕似乎太重了,我們需要一個輕量級的父視窗!那麼哪個輕量級的
容器控制項是具有gdk window的呢?我可不想再試,最直接的辦法是有個人告訴你!恩,到IRC裡找個大牛牛來回答這個
小小的問題吧!嘿嘿,很高興的在irc://irc.freenode.org/#gtk+中遇到了muntyan,這是一個大牛,他告訴我說
GtkEventBox是一個有gdk window的控制項!恩,就用它了!
所以,就有了下面的代碼!
01 /************************************/
02 /* main.c */
03 /************************************/
04 #include <gtk/gtk.h>
05
06 int main(int argc, char *argv[])
07 {
08 GtkWidget *window;
09 GtkWidget *button;
10 GtkWidget *eventbox;
11
12
13
14 GdkGC *gc;
15 GdkColormap *colormap;
16 GdkBitmap *window_shape_bitmap;
17
18 GdkColor black;
19 GdkColor white;
20
21 gtk_init(&argc, &argv);
22
23 /////////////////////////////////////////////////////////////////////////
24 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
25 gtk_window_set_title(GTK_WINDOW(window), "圓形視窗測試程式!");
26 gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);
27 gtk_signal_connect(G_OBJECT(window), "destroy",
28 G_CALLBACK(gtk_main_quit), NULL);
29
30 eventbox = gtk_event_box_new();
31 gtk_container_add(GTK_CONTAINER(window), eventbox);
32 gtk_widget_show(eventbox);
33
34 button = gtk_button_new_with_label("Hello,World!你好,世界!");
35 gtk_container_add(GTK_CONTAINER(eventbox), button);
36 gtk_widget_show(button);
37
38 gtk_widget_show_all(window);
39 /////////////////////////////////////////////////////////////////////////
40
41 //***************************************************************************
42 colormap = gdk_colormap_get_system ();
43
44 gdk_color_black (colormap, & black);
45 gdk_color_white (colormap, & white);
46
47 window_shape_bitmap = (GdkBitmap *) gdk_pixmap_new (NULL, 400, 300, 1);
48
49 gc = gdk_gc_new (window_shape_bitmap);
50 gdk_gc_set_foreground (gc, & black);
51 gdk_gc_set_background (gc, & white);
52 gdk_draw_rectangle (window_shape_bitmap, gc, TRUE,
53 0, 0, 400, 300);
54
55 gdk_gc_set_foreground (gc, & white);
56 gdk_gc_set_background (gc, & black);
57
58 // 在window_shape_bitmap中畫一個填充的圓
59 gdk_draw_arc (window_shape_bitmap, gc,TRUE,
60 0, 0, 400, 300, 0, 360*64);
61 gtk_widget_shape_combine_mask (eventbox, window_shape_bitmap, 0, 0);
62 //***************************************************************************
63
64 gtk_main();
65 return 0;
66 }
編譯,執行,效果如: