GTK+-2.0中不規則視窗的製作(下)

來源:互聯網
上載者:User

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 }

     編譯,執行,效果如:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.