Chinaunix首页 | 论坛 | 博客
  • 博客访问: 290257
  • 博文数量: 34
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 433
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-23 13:16
文章分类

全部博文(34)

文章存档

2011年(3)

2010年(4)

2009年(6)

2008年(21)

我的朋友

分类: LINUX

2008-11-13 10:04:18

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);
 
阅读(3511) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~