Gtk透明窗体和控件的研究

来源:互联网 发布:淘宝网都市丽人 编辑:程序博客网 时间:2024/04/30 06:27

网上这些类似的资料很多,我大致上都是用过,我个人总结如下:

透明的一般实现方法
1:使用异形窗体实现透明
在这里我引用了别人的一个sample,其原理就是在设置不规则窗体,然后设置控件的背景图实现透明,适合用于设置简单控件上面的图,使控件变为透明

#include <gtk/gtk.h>

 

int main(int argc, char *argv[])

{

   GtkWidget *window = NULL;

   GdkPixbuf *pixbuf = NULL;

   GdkBitmap *bitmap = NULL;

   GdkPixmap *pixmap = NULL;

 

   gtk_init(&argc, &argv);

 

   window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

   gtk_window_set_decorated(GTK_WINDOW(window), FALSE);       // 设置无边框

   gtk_widget_set_app_paintable(window, TRUE);

   gtk_widget_realize(window);

 

   pixbuf = gdk_pixbuf_new_from_file("demo1.png", NULL);       // gdk函数读取png文件

   gdk_pixbuf_render_pixmap_and_mask(pixbuf, &pixmap, &bitmap, 128);    // alpha小于128认为透明

   gtk_widget_shape_combine_mask(window, bitmap, 0, 0);          // 设置透明蒙板

   gdk_window_set_back_pixmap(window->window, pixmap, FALSE);          // 设置窗口背景

 

   g_object_unref(pixbuf);

   g_object_unref(bitmap);

   g_object_unref(pixmap);

 

   gtk_widget_show_all(window);

   gtk_main();

   return TRUE;

}

2:使用gtk_window_set_opacity实现窗体透明

这样可以设置整个窗体的透明度,但是缺点就是窗体上说有子元素也会跟着透明,也就是说窗体上的问题,图片,都会跟着一起透明。
其原理就是使用GDK相关库的基础实现
gdk_property_change (GTK_WIDGET (panel)->window,
                             gdk_atom_intern ("_NET_WM_WINDOW_OPACITY", FALSE),
                             gdk_atom_intern ("CARDINAL", FALSE), 32,
                             GDK_PROP_MODE_REPLACE,
                             (guchar *) & opacity,
                             1L);

使用方法就不说了,及其简单

这2个方法就是最基本的开发模式,但是根据需求,各开发者也要做很多余外的工作吧~

原创粉丝点击