DirectFB下的Gtk和X11的效果差异实在是大,一般都不可以使用X11下的方法使窗口透明,因此,在经过长期的研究后,终于使Gtk窗口(GtkWindow)在DirectFB下实现了半透明的效果。
该方法的根本原理是使用GdkPixmap贴图到GtkWindow上的Surface.
方法一:
在configure-event时,分配一个和Window打下匹配的GdkPixmap,在需要修改的地方使它半透明化, 在expose-event的时候,通过gdk_draw_drawable把它画到window中。
GdkPixmap *pixmap = NULL;
static gboolean gtk_window_configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data)
{
if(pixmap)
g_object_unref(pixmap);
pixmap = gdk_pixmap_new(widget->window, event->width, -1);
}
static gboolean gdk_window_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data)
{
if(pixmap)
gdk_draw_drawable(widget->window, widget->style->gc[GTK_WIDGET_STATE(widget)], pixmap, 0, 0, 0, 0, event->area.width, event->area.height);
}
方法二:
设置widget->style->bg_pixmap[GTK_WIDGET_STATE(widget)]为一个半透明的pixmap.
在GtkWindow初始化时(继承)或者初始化后(非继承使用), 首先使用gtk_widget_realize(widget),使其分配surface. 然后如下:
GtkStyle *style = gtk_style_copy(widget->style);
GdkPixmap *pixmap = gdk_pixmap_new(widget->window, 1, 1, -1);
//用cairo把pixmap变为半透明
//......
style->bg_pixmap[GTK_STATE_NORMAL] = pixmap;
gtk_widget_set_style(widget, sytle);
阅读(3552) | 评论(0) | 转发(0) |