1. 程式人生 > >Gtk透明窗體和控制元件的研究

Gtk透明窗體和控制元件的研究

網上這些類似的資料很多,我大致上都是用過,我個人總結如下:

透明的一般實現方法
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個方法就是最基本的開發模式,但是根據需求,各開發者也要做很多餘外的工作吧~