为了体现高度的可制定性.
对于GTK来说,肯定可以实现不规则的窗口.
但是如何实现呢?
在网上找到了一些资料.主要是用透明的图片来实现的.
下面我们来分析一下实现的过程.
pixbuf = gdk_pixbuf_new_from_file("./1.png",NULL);
gdk_pixbuf_render_pixmap_and_mask(pixbuf,&pixmap,&bitmap,128);
image = gtk_image_new_from_pixbuf(pixbuf);
gtk_container_add(GTK_CONTAINER(window),image);
pixmap = gdk_pixmap_new(image->window,gdk_pixbuf_get_width(pixbuf),gdk_pixbuf_get_height(pixbuf),-1);
gdk_pixbuf_render_to_drawable(pixbuf,pixmap,image->style-fg_gc[GTK_STATE_NORMAL],0,0,0,0,gdk_pixbuf_get_width(pixbuf),gdk_pixbuf_get_height(pixbuf),GDK_RGB_DITHER_NORMAL,0,0);
g_object_unref(pixbuf);
上面这些语句基本完成了对透明图像处理,形成不规则窗口的过程。
下面我们逐步分析。
pixbuf = gdk_pixbuf_new_from_file("./1.png",NULL);
创建一个新的pixbuf通过从文件中读取图像。第二个参数是出错处理的,可以不管。第一个参数是图像文件的名字。一般来讲我们把这个文件做成想要的形状,不需要的地方设置成透明的,一般用PS或者GIMP来处理。
gdk_pixbuf_render_pixmap_and_mask(pixbuf,&pixmap,&bitmap,128);
创建一个pixmap和bitmap,通过第二第三个参数返回。并且设置与pixbuf相同的透明度。这个函数只是一个转换函数。
image = gtk_image_new_from_pixbuf(pixbuf);
通过pixbuf创建一个image。
gtk_container_add(GTK_CONTAINER(window),image);
要显示image。
pixmap = gdk_pixmap_new(image->window,gdk_pixbuf_get_width(pixbuf),gdk_pixbuf_get_height(pixbuf),-1);
创建一个pixmap用给出的大小和深度。
gdk_pixbuf_render_to_drawable(pixbuf,pixmap,image->style-fg_gc[GTK_STATE_NORMAL],0,0,0,0,gdk_pixbuf_get_width(pixbuf),gdk_pixbuf_get_height(pixbuf),GDK_RGB_DITHER_NORMAL,0,0);
这个函数应该用gdk_draw_pixbuf代替。
让pibuf变得可绘图。
g_object_unref(pixbuf);
减少一个pixbuf的引用计数。
gdk_window_set_back_pixmap(image->window,pixmap,FALSE);
设置窗口的背景图片。