1

我正在为现有的 Mono/C#/GTK# 应用程序添加拖放支持。我想知道当我开始拖动对象时是否可以在鼠标指针下方出现的图标上使用 RGBA 透明度。

到目前为止,我意识到以下几点:

  • 我可以通过调用该Gtk.Drag.SourceSetIconPixbuf()方法来设置有问题的位图。但是,Alpha 透明度并不好用:不完全不透明的像素会以这种方式获得 100% 透明。
  • 我还尝试调用RenderPixmapAndMask()GdkPixbuf以便可以使用Gtk.Drag.SourceSetIcon()我的Screen. 它也不起作用:每当我开始拖动时,都会出现以下错误:

    [Gdk] IA__gdk_window_set_back_pixmap: assertion 'pixmap == NULL || gdk_drawable_get_depth (window) == gdk_drawable_get_depth (pixmap)' failed.

    这样,像素图甚至不会被复制,只有一个白色的形状(可能由 的mask参数设置SetSourceIcon())在拖动时显示。

我想问是否有办法让这些图标具有 alpha 透明度,尽管我没有这样做。如果不可能,讨论缺少此功能的原因的答案也会有所帮助。谢谢你。

(合成当然是在我的桌面上启用的(Ubuntu/10.10,Compiz/0.8.6-0ubuntu9)。)

4

1 回答 1

0

好的,最后我解决了。您应该创建一个新Gtk.WindowPOPUP类型,将其设置Colormap为屏幕的 RGBA 颜色图,让 Cairo 将背景擦除为透明颜色,在其上绘制您想要的任何内容,最后将其传递给Gtk.Drag.SetIconWidget().

示例代码(大概你会想在里面使用它OnDragBegin,或者在你有一个有效的拖动上下文要传递给的地方SetIconWidget()):

Gtk.Window window = new Gtk.Window (Gtk.WindowType.Popup);

window.Colormap = window.Screen.RgbaColormap;
window.AppPaintable = true;
window.Decorated = false;
window.Resize (/* specify width, height */);

/* The cairo context can only be created when the window is being drawn by the
 * window manager, so wrap drawing code into an ExposeEvent delegate. */
window.ExposeEvent += delegate {

    Context ctx = Gdk.CairoHelper.Create (window.GdkWindow);

    /* Erase the background */
    ctx.SetSourceRGBA (0, 0, 0, 0);
    ctx.Operator = Operator.Source;
    ctx.Paint ();

    /* Draw whatever you'd like to here, and then clean up by calling
       Dispose() on the context's target. */

    (ctx.Target as IDisposable).Dispose ();
};

Gtk.Drag.SetIconWidget(drag_context, window, 10, 10);
于 2010-10-28T11:42:07.997 回答