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