GTK+-2.0中不规则窗口的制作(下)

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 }

     编译,执行,效果如下图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值