免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6897 | 回复: 3
打印 上一主题 下一主题

GTK+-2.0中不规则窗口的制作 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-03 13:26 |只看该作者 |倒序浏览
GTK+-2.0中不规则窗口的制作(上)

                                           作者: xy_god

                                           邮箱: xy_god@163.com

                                        blog : http://hi.baidu.com/xy_god

    Google,百度了很久,中文的,英文的网页都搜索过了,但是很难找到关于使用GTK+-2.0制作不规则

窗口的文章!当然,还是有一些的,在FreeNode的IRC上遇到了一个中国人,BSCH,他提供了一种使用图

片制作圆形按钮的方法,尽管他很热心,但那并不完全符合我的需要,因为他的按钮对事件的响应还是在一个

矩形区域里,而且是gtkmm写的,我对gtkmm几乎没有什么了解,这里就不提了!但是对他的热心帮助还是

表示非常的感谢,尤其是他告诉我emacs下也可以用IRC,很实用,也很方便!

       另外,在公司同事的提示下,开始搜索gtk_widget_shape_combine_mask函数方面的文章,但是同

样很少有人用!功夫不负有心人,终于找到了glock-0.2.0这个软件,它是专门用来示例如何使用

gtk_widget_shape_combine_mask函数来制作不规则窗口的程序!当然,它还是很长的!全都讲解过来,

肯定要离制作不规则窗口这个主题非常非长的远!所以,我根据这个示例自己些了个例子,很短,也很切中要

害,嘿嘿(如果想看glock代码,它的主页是:http://www.brouhaha.com/~eric/software/glock/)!

       下面是我写的示例程序:

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 *hbox;

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      hbox = gtk_hbox_new(FALSE, 10);

31      gtk_container_add(GTK_CONTAINER(window), hbox);

32      gtk_widget_show(hbox);

33

34      button = gtk_button_new_with_label("Hello,World!你好,世界!");

35      gtk_box_pack_start_defaults(GTK_BOX(hbox), 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 (window, window_shape_bitmap, 0, 0);

62      //***************************************************************************

63   

64      gtk_main();

65      return 0;

66 }

       下面是Makefile:

CC=gcc

test:main.c

        $(CC) main.c -o test `pkg-config --cflags --libs gtk+-2.0`

       下面是该示例程序的效果图:

论坛徽章:
0
2 [报告]
发表于 2007-12-03 13:28 |只看该作者
                                                                      GTK+-2.0中不规则窗口的制作(下)
      啊,啊啊,这么简单!赶快做个椭圆的按钮出来看看!修改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 }
      编译,执行,效果如下图:

论坛徽章:
0
3 [报告]
发表于 2007-12-03 23:54 |只看该作者
经典办法.

论坛徽章:
6
酉鸡
日期:2013-11-04 15:30:02巳蛇
日期:2014-01-23 10:36:23双鱼座
日期:2014-01-23 13:08:332015亚冠之鹿岛鹿角
日期:2015-09-03 14:36:002015亚冠之武里南联
日期:2015-09-18 10:48:1315-16赛季CBA联赛之山西
日期:2016-05-05 00:05:33
4 [报告]
发表于 2012-11-30 11:42 |只看该作者
很感谢xy_god大神提供的办法,可以直接用了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP