http://blog.163.com/xy_god/blog/static/9148351200781734123827/
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`