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

yang98_2002_1977 2008-06-22 02:34:50
请问在linux怎么实现窗口的半透明,用gtk或者其他的技术,最好有相关的源码,谢谢
...全文
521 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yang98_2002_1977 2008-06-24
  • 打赏
  • 举报
回复
先把分给兄弟们,剩下的事情我自己去搞定了。
yang98_2002_1977 2008-06-23
  • 打赏
  • 举报
回复
gamedragon,能详细说说Compiz Fusion安转、开发环境的配置吗,谢谢
chenzhixin 2008-06-23
  • 打赏
  • 举报
回复
gtk_window_set_opacity本来可以设置透明的,但是要开启composite特效,
gtk_widget_is_composited可以取得,但我试过使用gdk_window_set_composited还是没用。

你可以使用gtk_widget_shape_combine_mask来做窗口透明,具体的我也没找见
chenzhixin 2008-06-23
  • 打赏
  • 举报
回复
#include <gtk/gtk.h>

/* 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;
}
shuiyan 2008-06-22
  • 打赏
  • 举报
回复
ms这个方法比WIN下面的强大很多。
gamedragon 2008-06-22
  • 打赏
  • 举报
回复
Compiz Fusion,想怎么透明怎么透明。
cceczjxy 2008-06-22
  • 打赏
  • 举报
回复
窗口有个属性可以控制,忘了具体怎么写的了。

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧