免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1159 | 回复: 0
打印 上一主题 下一主题

实现DirectFB下半透明窗口 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-13 10:04 |只看该作者 |倒序浏览
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);


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/74194/showart_1411450.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP