当前位置:  技术问答>linux和unix

请问怎么实现窗口的半透明,谢谢

    来源: 互联网  发布时间:2016-03-28

    本文导语:  请问在linux怎么实现窗口的半透明,用gtk或者其他的技术,最好有相关的源码,谢谢 | #include  /* The expose event handler for the event box.  *  * This function simply draws a transparency onto a widget...

请问在linux怎么实现窗口的半透明,用gtk或者其他的技术,最好有相关的源码,谢谢

|
#include 

/* The expose event handler for the event box.
 *
 * This function simply draws a transparency onto a widget on the area
 * for which it receives expose events.  This is intended to give the
 * event box a "transparent" background.
 *
 * In order for this to work properly, the widget must have an RGBA
 * colourmap.  The widget should also be set as app-paintable since it
 * doesn't make sense for GTK+ to draw a background if we are drawing it
 * (and because GTK+ might actually replace our transparency with its
 * default background colour).
 */
static gboolean
transparent_expose (GtkWidget      *widget,
                    GdkEventExpose *event)
{
  cairo_t *cr;

  cr = gdk_cairo_create (widget->window);
  cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
  gdk_cairo_region (cr, event->region);
  cairo_fill (cr);
  cairo_destroy (cr);

  return FALSE;
}

/* The expose event handler for the window.
 *
 * This function performs the actual compositing of the event box onto
 * the already-existing background of the window at 50% normal opacity.
 *
 * In this case we do not want app-paintable to be set on the widget
 * since we want it to draw its own (red) background. Because of this,
 * however, we must ensure that we use g_signal_register_after so that
 * this handler is called after the red has been drawn. If it was
 * called before then GTK would just blindly paint over our work.
 *
 * Note: if the child window has children, then you need a cairo 1.16
 * feature to make this work correctly.
 */
static gboolean
window_expose_event (GtkWidget      *widget,
                     GdkEventExpose *event)
{
  GdkRegion *region;
  GtkWidget *child;
  cairo_t *cr;

  /* get our child (in this case, the event box) */ 
  child = gtk_bin_get_child (GTK_BIN (widget));

  /* create a cairo context to draw to the window */
  cr = gdk_cairo_create (widget->window);

  /* the source data is the (composited) event box */
  gdk_cairo_set_source_pixmap (cr, child->window,
                               child->allocation.x,
                               child->allocation.y);

  /* draw no more than our expose event intersects our child */
  region = gdk_region_rectangle (&child->allocation);
  gdk_region_intersect (region, event->region);
  gdk_cairo_region (cr, region);
  cairo_clip (cr);

  /* composite, with a 50% opacity */
  cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
  cairo_paint_with_alpha (cr, 0.5);

  /* we're done */
  cairo_destroy (cr);

  return FALSE;
}

int
main (int argc, char **argv)
{
  GtkWidget *window, *event, *button;
  GdkScreen *screen;
  GdkColormap *rgba;
  GdkColor red;

  gtk_init (&argc, &argv);

  /* Make the widgets */
  button = gtk_button_new_with_label ("A Button");
  event = gtk_event_box_new ();
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

  /* Put a red background on the window */
  gdk_color_parse ("red", &red);
  gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &red);

  /* Set the colourmap for the event box.
   * Must be done before the event box is realised.
   */
  screen = gtk_widget_get_screen (event);
  rgba = gdk_screen_get_rgba_colormap (screen);
  gtk_widget_set_colormap (event, rgba);

  /* Set our event box to have a fully-transparent background
   * drawn on it. Currently there is no way to simply tell GTK+
   * that "transparency" is the background colour for a widget.
   */
  gtk_widget_set_app_paintable (GTK_WIDGET (event), TRUE);
  g_signal_connect (event, "expose-event",
                    G_CALLBACK (transparent_expose), NULL);

  /* Put them inside one another */
  gtk_container_set_border_width (GTK_CONTAINER (window), 10);
  gtk_container_add (GTK_CONTAINER (window), event);
  gtk_container_add (GTK_CONTAINER (event), button);

  /* Realise and show everything */
  gtk_widget_show_all (window);

  /* Set the event box GdkWindow to be composited.
   * Obviously must be performed after event box is realised.
   */
  gdk_window_set_composited (event->window, TRUE);

  /* Set up the compositing handler.
   * Note that we do _after_ so that the normal (red) background is drawn
   * by gtk before our compositing occurs.
   */
  g_signal_connect_after (window, "expose-event",
                          G_CALLBACK (window_expose_event), NULL);

  gtk_main();

  return 0;
}

|
ms这个方法比WIN下面的强大很多。

|
窗口有个属性可以控制,忘了具体怎么写的了。

|
Compiz Fusion,想怎么透明怎么透明。

    
 
 

您可能感兴趣的文章:

  • 请问如何看当前目录的剩余空间,谢谢! iis7站长之家
  • 请问JBulider 4的序列号谁知到?能否提供给小弟?谢谢
  • 请问那里有java中图像特效的代码下载?谢谢
  • 请问谁有Jbuilder5 Enterpeise的注册码,谢谢了!
  • 请问java用什么工具编写?在哪里运行?我刚开始学,不太懂,谢谢了
  • 请问运行编译EJB,需要在什么环境下,如何配置,请给出详细的说明,谢谢!在线......
  • 我是新手,请问在哪里更改系统时间?谢谢
  • 请问哪儿有完整的JDK1.4或者1.3的DOCUMENT下载。谢谢
  • 请问如何在一个JSP页面调用一个exe程序呢?谢谢!
  • 请问如何用jni类来调用一个非java写的外部exe?谢谢!
  • 请问webloigc 的API的帮助文档,在什么位置我,没找到谢谢了。
  • 请问在rh7.3中,如何更改计算机名?谢谢
  • 请问Linux显示当前版本的命令是什么?谢谢
  • 请问如何看当前目录的剩余空间,谢谢!
  • 请问JAVA中怎样去掉字符串后面的空格,谢谢!!!
  • 请问哪里有JDK的最新版本下的!!(只要对就给全分)谢谢
  • 请问学习java比较好的中文书籍有哪些,谢谢!
  • 请问哪有JSDK下载?谢谢!
  • 请问那里有hp openview下载,for windows,急 谢谢
  • 请问如何在页面显示 .swf图片文件,谢谢!
  • 请问高手linux中用md5来实现一串字符串的加密,用c++/c实现
  • 求助:用JSP实现统计来访人数,请问怎样实现?
  • 请问连接池的工作原理和实现
  • 请问:有没有人在Linux下实现过计费网关?
  • 请问各位大虾,怎么实现三层页面之间的参数传递?
  • 请问如何在JTextPane里实现画表格的功能,就想word那样!!!!
  • 请问在linux内核实现浮点运算怎么弄?
  • 请问shell能实现注册的功能吗?
  • 请问聊天室中显示用户在线离线的原理是怎样?有哪些方法实现呢?
  • 请问Jb怎么实现系统登录程序!
  • 请问,pipe()这个管道建立函数在哪里实现的?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问:我知道路由器的telnet密码,但忘记了enable 密码,请问如何是好?
  • 请问那里有SYBASE的jbdb 2.0下载;jspsmartupload可以直接将文件上传到数据库,请问如何使用
  • 请问最新的reahat9.0是基于什么核心的?2.4?2.6?请问那里能下载?
  • 请问:请问哪里有关于linux基本操作命令讲解的资料下载,最好是幻灯片格式的.
  • 请问,我试图用#admintool&图形工具命令来安装sun workshop5.0,为什么进入的却是用户管理界面?请问具体该如何在solaris下安装应用软件
  • 请问玩过SOLARIS的高手门,在不正常关机后,就不能启动到windows公用桌面了,只能在命令提示模式下了,请问怎么解决这个问题啊?急~!~!
  • 请问:我在redhat下装了bochs-2.2.1-1.rpm,.装了后,想设置一下,但找不到bochsrc.fda.bxrc,请问这个文件在哪个曰录下啊。
  • 请问:在配置Qt时,很多文档都说在.profile,.login里加东西,但是我好像没有发现有这两个文件上,请问这些文件在哪个目录下啊
  • 请问:在GCC里的C程序里的变量的声明是不是只能在前面,而且相同类型的变量的声明只能放在一起?如果不是,请问怎么样可以解决这个问题.
  • 请问各位大虾,小弟今天开始学jsp了,这学期我们有java课,所以已经下载了jdk(好象是1.2),请问我的98环境怎么配置jsp环境呀?我的jdk可以运行.java程序,别的我就不知道了....谢谢!
  • 主机是WIN2000,我用的是LUNIX,请问是否可以共享上网? 如果可以请问如何设置? 500分答谢,龟儿食言!
  • 请问linux下GUI开发的问题!
  • 请问出现fstab文件丢失该怎么修复呀?
  • 请问这个方法如何调用?
  • 请问一个奇怪的问题!
  • 请问在网页中打开的新窗口,如何让其居中。
  • 请问我该学什么了
  • 请问安装zhcon,cxterm问题
  • 非常急! 请问daemontools 在red hat 9下的安装问题? 在线等待
  • 请问如何在一台单机上装VMware的网络访问问题?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3